Java学习16-- 面向对象学习45. 面向对象三大特征抽象类和接口

面向对象学习4. 面向对象三大特征

  • 1封装:高内聚(内部细节自己用,外部不能介入),低耦合(保留很少接口给外部使用),信息隐藏(禁止外界直接访问内部数据(private),如需要,可通过get/set接口访问)(method get/set下面有详细说明)
  • 2继承
  • 3多态

封装详解

面向对象学习5. 抽象类和接口

private/get/set详细说明:
实际操作中 class内部不是经常用public String def_name而是经常用 private String def_name;
但private的数据不可获取,解决方案是利用自建public get/set method下面新建变量,连接private变量,这样就能保证内部的加密性和模块固定完整性了。

比如在main里面新建一个my_class类型的object叫做x
my_class x = new my_class();
然后给x赋值,注意到my_class本身是公开的public class my_class{},但是其内部的接口全是private的,类似private String int_name;无法直接在main内调用int_name的值。

解决方案:
my_class类型下面加public get/set method

大概结构原理类似这样

public class my_class{
private String int_name;

public String get_name{return int_name;}

public void set_name(String io_name){this.int_name=io_name;}
}

具体代码如下


public class testjan05{
public static void main(String args[]) {
        my_class x = new my_class();
		//新建object
		//为non_s类型(需要按照non_s的class类型制作)
		//这个object取名叫做x
        x.set_name("Emma");
		//执行x里面的method方法set_name,
		//并给了一个叫做Emma的输入值
        System.out.println(x.get_name());}
		//打印输出x下的method方法get_name的返回值
}

//这是对应的my_class文件
public class my_class {
    private String int_name;


    public void set_name(String io_name) {
        this.int_name = io_name;
    }
	//io_name是能够连接外部接口的公开接口
	//int_name是my_class内部的private接口

    public String get_name() {
        return int_name;
    }
//外部需要int_name信息的时候,int_name是private无法调用
//就想办法调用public的method get_name即可

}

输出为

Emma

快捷键
IDEA 自动生成Get/Set模块

Alt+insert(AUUS电脑可能需要额外再按Fn键)

在这里插入图片描述

按下之后选择Getter或者Setter即可获得所想要的接口模块(如上图所式)

代码举例

package oop;

//import oop.Demo03.pet;
import oop.Demo04.Student;
public class Application {
    /*
    public static void main(String[] args) {
       pet doggy =new pet();
       doggy.name="wangcai";
       doggy.age =3;
       doggy.shout();

        System.out.println(doggy.name);
        System.out.println(doggy.age);
        System.out.println();

    }
     */


    public static void main(String[] args) {
        Student x = new Student();
        x.setName("Ella");
        x.setAge(33);
        System.out.println(x.getName());
        System.out.println(x.getAge());
    }

}




package oop.Demo04;

public class Student {
 private String name;
 private int age;
 private int id;


    public String getName() {
        return this.name;
    }

    public int getAge() {
        return age;
    }

    public int getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }
    



    public void setAge(int def_age) {
        if (def_age <0 || def_age >120)
            this.age=3;
        else
            this.age = def_age;
    }

    public void setId(int id) {
        this.id = id;
    }
}


运行运行结果

Ella
33


get/set method的存在,可以帮助程序员在不改变内部结构的前提下,对代码控制维护
比如下面的例子,增加了age并且对输入的age范围控制为0-120,否则赋值666


public class testjan05{
public static void main(String args[]) {
        non_s x = new non_s();
        x.set_name("Lisa");
        System.out.println(x.get_name());
        x.setInt_age(166);
        System.out.println(x.getInt_age());


}
}



public class non_s {
    private String int_name;
    private int int_age;


    public void set_name(String io_name) {
        this.int_name = io_name;
    }

    public String get_name() {
        return int_name;
    }

    public void setInt_age(int io_age) {
        if (io_age >= 0 && io_age <= 120)
        this.int_age = io_age;
        else this.int_age=666;
    }

    public int getInt_age() {
        return int_age;
    }
}


总结:封装接口的作用

  1. 提高代码的安全性
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 增加系统的可维护性
补充知识点:方法的重载
  • 思考:为什么println(x)可以输出很多不同种类的x呢?
    比如x可能是char int float String为什么println都能直接输出呢?

在IDEA里面找到一处出现println的地方,按住ctrl键,跳转到println的源码,会发现,源码将能想到的各种input全类型囊括了,一项写一个method。
这些定义的method全部都叫println,他们是同名的,但是他们每一个method定义的输入类型都是不同的。

继承

继承用于class之间。先学一个关键词extends
extends表示继承 扩展,Class kids extends Class human
子类kids继承了父类human的属性

  • 问题:什么是object class?
    先说结论:在java中,全体class代码都默认继承Object class

在java中 class相当于样板,新建的object需要根据对应的class样板来依葫芦画瓢。而所有自建的class都有一个共同的“爸爸”它就是Object class注意这个“Object”首字母是大写的。

  • 验证Object class的存在(在IDEA中):
    打开Hierarchy模块
    在IDEA里面打开View/Tool Window/Hierarchy可以在屏幕右侧看到Hierarchy模块,默认已经选中了当前的文件,可以看到它是在一个叫public class Object的文件结构下列着

如果还想查看其他的文件,选中一个文件比如Application,然后快捷键Ctrl+H即可打开hierarchy window里看到对应的结构信息

在这里插入图片描述

可以看到 最上面通通都有一个Object字样。
结论 在java中,全体class代码都默认继承Object class

注意只有单继承,没有多继承。一个儿子class只能有一个爸爸class,但是一个爸爸class可以有多个儿子class。

使用方法


public class kids extends human{
   //表明kids class继承了human class的全部功能模块和其变量&值
   //kids本身是空的
}




public class human {

    public static void talk() {
        System.out.println("小嘴巴巴说个不停");

    }

    public static int valuables() {
	//public 换成 private 就不能被继承了,如果调用就会报错
	//如果不写,默认为public
        int money = 1_000_000_000;
        return money;

    }

}



public class testjan05{
public static void main(String args[]) {

kids x = new kids();
//新建一个kids类型的object叫做x,样本从kids class那里来
x.talk();
//调用x object里面的talk method
//注意kids类型本身是空的,talk method能用,只可能是从human class那里继承的


System.out.println(x.valuables());



}
}


程序运行结果:

小嘴巴巴说个不停
1000000000

想要子类继承 那必须是public的,一旦设置为private,继承并且使用的子类马上会报错。 默认的四个属性修饰符为public/private/default/protected

如果想要使用内部private的变量,那么可以自定义前面介绍过的get/set method进行获得再使用。

比如对刚才的例子进行修改



public class human {

    public static void talk() {
        System.out.println("小嘴巴巴说个不停");

    }
    private int money=6_00_000_000;
	//注意这里的money已经变成private了。卖年里面之前的调用方法不合适了


    public int getMoney() {
        return money;
    }//这里创建public getMoney method,
	//成功将class内部private的money变量通过public method getoney的return引出
}


kids程序除继承语句仍为空,main主程序如下


public class testjan05{
public static void main(String args[]) {

kids x = new kids();

x.talk();


//System.out.println(x.valuables());
    System.out.println( x.getMoney());



}
}



最后运行结果

小嘴巴巴说个不停
600000000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/377094.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【办公技巧】如何设置Word文档部分内容无法编辑?

工作中&#xff0c;我们可能会在word中制作一些请柬、表格之类的&#xff0c;有些文件内容不想要进行修改&#xff0c;为了防止他人随意修改内容。我们可以设置限制编辑&#xff0c;可以对一部分内容设置限制编辑&#xff0c;具体方法如下&#xff1a; 我们将需要将可以编辑的…

centos7 安装mysql8

下载mysql wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar解压安装 tar xvf mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar yum -y localinstall *.rpm初始化 mysqld --initialize --usermysql需要选择mysql用户&#xff0c;否则可…

HARRYPOTTER: NAGINI

攻击机 192.168.223.128 目标机 192.168.223.145主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.145 开启了22 80端口 先看一下web界面 跟系列1一样是一张图片 看一下源码 没东西 看一下robots.txt 也没东西 再扫一下目录吧 gobuster dir…

用通俗易懂的方式讲解:一文搞懂大模型 Prompt Engineering(提示工程)

本文将从提示工程的本质、提示工程的原理、提示工程的应用三个方面&#xff0c;带您一文搞懂提示工程 Prompt Engineering 。 文末精选通俗易懂的方式讲解系列&#xff0c;如果你喜欢技术交流&#xff0c;文末可以加入 文章目录 提示工程的本质提示工程的原理提示工程的应用技…

常见的 MIME(媒体)类型速查

一、简介 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型&#xff0c;是设定某种扩展名的文件用一种应用程序来打开的方式类型&#xff0c;当该扩展名文件被访问的时候&#xff0c;浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文…

java程序jar包xjar加密及破解解密

超短连接转换j1z.cc&#xff08;永久有效&#xff09; 背景 项目要部署到第三方服务器上&#xff0c;于是研究了一下jar包加密的方式&#xff0c;其中在github上有一个项目XJar&#xff0c;挺多使用用户&#xff0c;也搜到了破解的教程&#xff0c;于是研究了一下。详细说下如…

实战分享:SpringBoot在创新创业项目管理中的应用

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【前端web入门第五天】01 结构伪类选择器与伪元素选择器

文章目录: 1.结构伪类选择器 1.1 nth-child(公式) 2.伪元素选择器 1.结构伪类选择器 作用:根据元素的结构关系查找元素。 选择器说明E:first-child查找第一个E元素E:last-child查找最后一个E元素E:nth-child(N)查找第N个E元素&#xff08;第一个元素N值为1) 一个列表结构…

leetcode 1.两数之和(C++详细题解)DAY1

文章目录 1.题目描述示例提示 2.解答思路&#xff08;1&#xff09;暴力解法&#xff08;2&#xff09;哈希表 3.实现代码结果 4.总结 1.题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c…

位运算01 插入[C++]

图源&#xff1a;文心一言 上机题目练习整理&#xff0c;位运算&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 网页版目录在页面的右上角↗~&#x1f95d;&#x1f95d; 第1版&#xff1a;在力扣新手村刷题的记录~&#x1f9e9;&#x1f9e9; 编辑&#xff1a;梅…

vue3-内置组件-KeepAlive

KeepAlive <KeepAlive> 是一个内置组件&#xff0c;它的功能是在多个组件间动态切换时缓存被移除的组件实例。 基本使用 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0c;会创建…

深入探究 HTTP 简化:httplib 库介绍

✏️心若有所向往&#xff0c;何惧道阻且长 文章目录 简介特性主要类介绍httplib::Server类httplib::Client类httplib::Request类httplib::Response类 示例服务器客户端 总结 简介 在当今的软件开发中&#xff0c;与网络通信相关的任务变得日益普遍。HTTP&#xff08;Hypertext…

Linux | 进度条 | Linux简单小程序 | 超级简单 | 这一篇就够了

进度条—实例示范 在学习了基本的Linux指令&#xff0c;Linux上vim编译器等等之后&#xff0c;我们就来学习写代码喽~ 今天就给大家详细讲解一下进度条的编写&#xff0c;需要的效果如下图&#xff1a; 进度条—必备知识 回车和换行 在我们学习编程语言中&#xff0c;经常…

2024年【G1工业锅炉司炉】考试及G1工业锅炉司炉考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G1工业锅炉司炉考试为正在备考G1工业锅炉司炉操作证的学员准备的理论考试专题&#xff0c;每个月更新的G1工业锅炉司炉考试内容祝您顺利通过G1工业锅炉司炉考试。 1、【多选题】TSGG0001-2012《锅炉安全技术监察…

高中学校档案室主要做什么

高中学校档案室主要负责管理、保存和维护学校的各类档案文件。具体工作内容包括&#xff1a; 1. 档案收集&#xff1a;负责收集学校各个部门的档案文件&#xff0c;包括学生档案、教职工档案、教学档案、行政档案等。 2. 档案分类和整理&#xff1a;对收集到的档案文件进行分类…

Nginx限流设置

1.反向代理(建议先看正向代理,反向代理则是同样你要与对方服务器建立连接,但是,代理服务器和目标服务器在一个LAN下,所以我们需要与代理服务器先建交,再由他获取与目标服务器的交互,好比一个带刀侍卫守护着目标服务器) 屏蔽目标服务器的真实地址&#xff0c;相对安全性较好&am…

相机图像质量研究(6)常见问题总结:光学结构对成像的影响--对焦距离

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

鸿蒙OS导入项目报错不能运行 @ohos\hvigor\bin\hvigor.js‘

在自学HarmonyOS时&#xff0c;想在DevEco Studio导入官方示例代码&#xff1a;待办列表&#xff08;ArkTS&#xff09;报错 C:\Users\woods\Downloads\test01\ToDoListArkTS\node_modules\ohos\hvigor\bin\hvigor.js --mode module -p moduleentrydefault -p productdefault …

SpringBoot集成Swagger2的增强版Knife4j

1. 背景 作为SpringBoot集成中间件其中的一篇文章吧&#xff0c;既然打算出这么一个系列了&#xff0c;争取做到虽小却全&#xff0c;又精又美的一个系列吧。 Swagger应该都有接触吧&#xff0c;knife4j是Swagger2的增强版&#xff0c;更加友好的操作页面&#xff0c;更多强大…