Java面向对象的特性:封装,继承与多态

news/2024/7/8 1:45:20

Java面向对象的特性

在学习Java的过程是必须要知道的Java三大特性:封装、继承、多态。如果要分为四类的话,加上抽象特性。

封装

1.封装概述
是面向对像三大特征之一(封装,继承,多态)
是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对像内部的,外界是无法直接操作
2.封装原则
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问成员变量private,提供对应的getXxx()/setXxx()方法
3.封装好处
通过方法来控制成员变星的操作,提高了代码的安全性
把代码用方法进行封装,提高了代码的复用性

//封装类
public class 类名(){
	修饰符 类名 (参数){
		
	}
}

//Main方法
public class Demo {
    public static void main(String[] args) {
		类名 变量名 = new 类名();
	|

封装主要是通过Main方法new个对象从而调用封装起来的方法,默认封装内的方法主体是由一个无参构造,如果写了有参构造会忽略无参构造,建议每次添加无参构造。

构造方法注意事项

1、构造方法创建:
如果没有定义构造方法,系统会默认给出一个无参构造方法
如果定义了构造方法,系统将不提供无参构造方法
2、构造方法重载
如果自定义了带参构造方法,还有使用无参构造方法,需要再写一个无参构造方法
3、推荐使用
无参构造每次必写

this与super

为什么要把this与super放在这里介绍,因为从面向对象开始,通过私有化变量的调用就会发生变化,而对于本类中,如果出现同名变量的情况,添加this与super与不添加有极大的差别。如下

在这里插入图片描述

不同颜色框起来的代表所指向的是一样的,红色代表本内私有变量,如果在重名情况下想调用需要添加关键字this,代表向本内上一层去寻找;蓝色表示传入参数。
翻译:将传入的name赋值到本类中的name变量。

setXXX()与getXXX()方法

借着封装再说一下这setXXX()与getXXX()方法,首先对于私有变量是没办法直接在其它类中调用的,需要通过这两个方法进行写入与获取

成员变量与局部变量区别

在这里插入图片描述

继承

含义:多个类中存在共同属性,则可以抽取出来形成父类,让多个类去调用父类的变量与方法。
好处:提高代码的复用性

注意事项:

  1. Java中只支持单继承不支持多继承;
  2. 一个类可以被多个类继承;
  3. 多层继承,一个类的父亲可以再去继承另一个父类
  4. 成员变量继承只能继承非私有化;

方法重写

概述:
子类中出现了和父类一样的方法声明
_
方法重写的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,既沿袭了父类功能,又定义了子类特有的内容。
_
@Override
是一个注解
,可以帮助我们检查重写方法的方法声明的正确性

方法重写注意事项
1、私有方法不能被重写(父类私有成员子类是不能继承的)
2、子类方法访问权限不能更低(public>默认>私有)
父类:
在这里插入图片描述
子类
在这里插入图片描述
private子类访问public父类被拒。
父类默认,子类是public可以访问。

Java中继承的注意事项

Java中类只能单继承不支持多继承
Java中类支持多层继承

修饰符

权限修饰符

在这里插入图片描述

权限修饰符单独来讲比较枯燥,可以换个思路——你的钱与家庭
首先private可比作自己,钱只能自己花,别人花不到!
_
但是private就不一样,以比作家庭,你的钱除了自己,还能给家里媳妇跟孩子花,家里的成员可以花,但是不会给别人花,别人也花不到!
_
protected解释是不同包的子类,相当于是在外面的私生子,这个私生子有时候也得给点钱花花,但是无关的人还是花不到
_
最后是公共类,所有人都可以用。

final修饰局部变量

就是限定:要是变量基本类型,修饰的数据值不能发生改变;要是变量引用类型,对应地址值不能发生改变。但是地址里面的内容可以变化

static静态

可以修饰成员方法与成员变量

static修饰的特点

被类的所有对象共享
这也是我们判断是否使用静态关键字的条件
可以通过类名调用
当前也可以通过对象名调用【推荐使用类名调用】

在这里插入图片描述
在这里插入图片描述

static访问特点

因为static在编译过程就已经初始化好存在方法区,所以最先出来对应特点:
非静态成员对于成员变量与成员方法不论静态还是非静态都可以访问;
静态成员、方法只能访问静态成员、方法

静态成员内存图

在这里插入图片描述

多态

同一对象在不同时刻表现出来的不同形态

前提与体现

1、有继承/实现类关系
2、有方法重写
3、有父类引用指向子类对象

如下图:
1、继承类关系
在这里插入图片描述
2、方法重写
父类:
在这里插入图片描述
子类:
在这里插入图片描述
3、父类引用指向子类
在这里插入图片描述

多态的访问特点

其实就是访问父类,或者重写内容,访问成员变量是父类,方法是子类。

在这里插入图片描述
在这里插入图片描述
记忆口诀:

方法编译看左边,运行看右边
变量都是左边

多态的优缺点

多态的好处:
提高了程序的扩展性
_
多态的弊端:
不能使用子类的特有功能

多态的转型

对于多态的弊端,进行优化,为此有了多态的转型

Test_Fu a = new Test_Zi();
a.speak();
System.out.println(a.age);
//向下转换,指向地址没有问题
Test_Zi c = (Test_Zi)a;
System.out.println(c.age);
//向上转换
a = new Test_Zi2();
a.speak();
//ClassCastException
Test_Zi d = (Test_Zi)a;
System.out.println(d.age);

在这里插入图片描述

抽象

在Java中一个没有方法体的方法应该被定义为抽象方法。而类中如果有抽象方法,该类必须定义为抽象类。

抽象类的特点

1、抽象类和抽象方法必须使用abstract关键字修饰

public abstract class 类名(){}
public abstract void eat(){}

2、抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类
3、抽象类不能实例化
方法:参照多态形式,通过父类引用指向子类(子类对象实例化),这叫做抽象类多态
4、抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类

抽象类成员特点

-成员变量
可以是变量也可以是常量
-构造方法
有构造方法但不能实例化:用于子类访问父类数据的初始化。
~成员方法
可以有抽象方法,限定子类必须完成某些动作
也可以有非抽象方法:提高代码复用性。

接口

接口就是一种公共的规范标准,只要符号规范标准,大家都可以通用
Java中的接口更多体现在对行为的抽象

接口的特点

1、接口用关键字interface修饰
public interface 接口名{}
2、类实现接口用implement表示
public class 类名 implement 接口名{}
3、接口不能实例化
①接口如何实例化:参照多态,通过实例化类对象实例化,这叫接口多态。
②多态形式:具体类多态,抽象类多态,接口类多态
③多态前提:有继承或者实现关系;方法重写;有父(类/接口)引用指向(子/实现)类对象
4、接口实现类
要么重写接口中的所有抽象方法
要么是抽象类

接口成员特点

~成员变量:
是静态且是常量,默认 public static final
~构造方法
接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在,一个类如果没有父类,默认继承Object类
~成员方法:
只能是抽象方法
默认修饰符:public abstract

在这里插入图片描述

总结

类和接口的关系

1、类和类的关系
继承关系,只能是单继承,但是可以多层继承
2、类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
3、接口和接口的关系
继承关系,可以单继承也可以多继承

抽象类与接口的区别

在这里插入图片描述
为什么不单独定义某一个

抽象是对事物的抽象,接口是对行为的抽象

比如:能报警的门;
如果将报警方法放到抽象中,则代表这是所有门的共性,但是有的门不能报警。
如果将开门关门放在接口门中,且也有报警功能,则代表报警的是都能开关的,报警器就不是,即将共有行为放在抽象,特有行为放在接口,通过对象继承后再实现接口里面的特有。


http://lihuaxi.xjx100.cn/news/903450.html

相关文章

使用迭代器遍历List抛出ConcurrentModificationException异常分析。

目录异常复现原因分析例子源码分析解决方案异常复现 使用迭代器对java中List遍历时,程序抛出了ConcurrentModificationException异常。这是由于Java的 fast-fail 机制(快速失败)导致的,可以提前预料遍历失败情况。看下面的例子。 …

LeetCode-1792. 最大平均通过率【堆,优先队列,贪心】

LeetCode-1792. 最大平均通过率【堆,优先队列,贪心】题目描述:解题思路一:优先队列。首先任何一个班级(x,y)加入一个聪明的学生之后增加的通过率为diff(x1)/(y1)-x/y。那么对p进行堆排序,每次取最大的即可。解题思路二…

19 pandas 分层索引与计算

文章目录分层设置与查询数据index 为有序index 为无序(中文)查看数据示例多层索引的创建方式(行)1、from_arrays 方法2、from_tuples 方法3、from_product 方法多层索引的创建方式(列)分层索引计算MultiIndex 参数表分…

Linux下的Jenkins安装教程

当前环境 CentOS 7.8Java 11(注意当前jenkins支持的Java版本最低为Java11)FinalShell 3.9(操作环境) 安装Jenkins PS:不建议使用Docker安装Jenkins,因为使用Jenkins的时候一般会调用外部程序,…

RabbitMQ 入门到应用 ( 五 ) 应用

6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…

华为OD机试 - 静态扫描最优成本(JS)

静态扫描最优成本 题目 静态扫描快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 文件扫描的成本和文件大小相关,如果文件大小为 N ,则扫描成本为 N 个金币扫描报告的缓存成本和文件大小无关,每缓存一个报告需要 M 个金币扫描报告缓存后,后继再碰到该文件则不…

linux018之安装mysql

linux上安装mysql: 第一步:查看是否已经安装mariadb,mariadb是mysql数据库的分支,mariadb和mysql一起安装会有冲突,所以需要卸载掉。 yum list installed | grep mariadb :查看是否安装mariadb,…

适合初学者的超详细实用调试技巧(上)

我们日常写代码的时候,常常会遇到bug的情况,这个时候像我这样的初学者就会像无头苍蝇一样这里改改那里删删,为了根除这种情况,我最近系统学习了调试的技巧,我想要十分详细地讲解,所以大概不会一篇文章写完。…