封装:对象代表什么,就得封装对应的数据,并提供数据对应的行为。
继承: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(…….) 访问父类构造方法 |