0%

面向对象进阶-继承

封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。

继承:Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。

public class Student extends Person(){}

Student称为子类,Person称为父类

1.优点

可以把多个子类中重复的代码抽取到父类中,提高代码的复用性

子类可以在父类的基础上,增加其他的功能,使子类更强大。

子类可以得到父类的属性和行为,子类可以使用。

什么时候用到继承?:当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种(学生是人的一种),就可以考虑使用继承来优化代码。

2.方式

1.自己设计

2.用别人的

3.特点

​ Java只支持单继承:

不支持多继承:

支持多层继承:子类A继承父类B,父类B可以继承父类C(直接父类(BA,CB),间接父类(CA))

每一个类都直接或间接的继承于Object(祖宗类)

4.子类到底能继承父类中的那些内容?:(继承和调用不一样)

内容
构造方法 非私有(NO) private(NO)
成员变量 非私有(YES) private(YES) get/set方法去使用
成员方法 非私有(YES)//虚方法表 private(NO)

违背了构造方法的规则:构造方法名与类名必须相同。

只有父类中的虚方法(非private,非static,非final)才能被子类继承,生成虚方法表传给子类

5.内存分析工具的使用:

控制台输入jps:类的地址

内存分析工具:控制台输入 jhsdb hsdb

6.继承中的特点

继承中:成员变量的访问特点

就近原则:谁离我近,我就用谁,先在局部位置找,然后本类位置找,父类成员位置找,逐级往上。

​ 如果重名了怎么访问?:

​ 从局部位置开始往上找,name

​ 从本类成员位置开始往上找, this.name

​ 从父类成员位置开始往上找, super.name

继承中:成员方法的访问特点

​ 直接调用:谁离我近,我就用谁

​ 先查看本类中是否有对应方法,有,就会调用子类的,如果没有,就会调用从父类中继承下来的对应方法

​ super调用: 直接访问父类

​ 不会查看本类,直接查看父类中是否中是否有对应的方法

继承中:构造方法的特点

​ 父类中的构造方法不会 被子类继承。(构造方法名与类名不一致了)

​ 子类中所有的构造方法默认先访问父类中的无参构造,在执行自己的

原因:

​ 子类在初始化的时候,又可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。

​ 子类在初始化之前,一点要调用父类构造方法先完成父类数据空间的初始化

调用父类方法

​ 子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行

​ 如果想调用父类的有参构造,必须手动写super进行调用

方法的重写:当父类的方法不能满足子类现在的需求时,需要进行方法重写

​ 书写格式:在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

​ @Override重写注解—给虚拟机和程序员看的

​ 1.@Override是放在重写后的方法上,校验子类重写时语法是否正确

​ 2.加上注解后如果有红色波浪线,表示语法错误。

​ 3.建议重写方法都加@Override注解,代码安全,优雅

​ 要求:

​ 1.重写方法的名称,形参列表必须与父类中的一致。

​ 2.子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)。

​ 3.子类重写父类方法时,返回值类型必须小于等于父类。

4.建立:重写的方法尽量和父类保持一致。

5.只有被添加到虚方法表中的方法才能被重写。

7.this,super使用总结

​ this:本类,理解为一个变量,表示当前方法调用在的地址值。

​ super:代表父类存储空间

关键字 访问成员变量 访问成员方法 访问构造方法
this this.成员变量
访问本类的成员变量
this.成员方法(…..)
访问本类成员方法
this(…..)
访问本类构造方法
super super.成员变量
访问父类成员变量
super.成员方法(…..)
访问父类的成员方法
super(…….)
访问父类构造方法