一、什么是继承
java中提供一个关键字extends,用这个关键字我们可以让一个类和另一个类建立起联系。
public class Student extends Person{}
student称之为子类(派生类),Person称之为父类(基类或超类)。
继承有哪些好处?
继承可以把多个子类中重复的代码抽取到父类中,提高代码的复用性。
换而言之,子类可以在父类的基础上,增加其他的功能,使子类变得更加丰富。
二、什么时候时候继承
当类于类之间存在相同的内容。并且满足子类是父类的一种。就可以使用继承来优化代码。
请注意,使用继承必须同时满足这两个条件。
举个例子:
人类(父亲) 学生 老师(子类)
学生和老师都有吃饭,喝水相同行为。学生和老师都是人类。因此可以抽取到(人类)父类中
举个错误的示范:
人类(父亲) 程序员 苹果手机(子类)
程序员和苹果手机虽然都有姓名和重量这两个相同的属性。但是苹果是商品,不满足人类的一种。因此不可以产生继承关系。
三、继承的特点
java和c++不相同。Java中只支持单继承,不支持多继承,但支持多层继承。
A->B->C->D->E 此种关系中,D是E的直接父类,ABC是E的间接父类。
在java中,A并不是真正的祖宗,虚拟机还会将其自动继承给object(隐藏操作)。
Java中所有的类都直接或者间接继承与object类。
四、如何设计继承
画图法:
将所有的元素在一排画好,提取他们的相同属性或者行为,构造父类,重复以上操作。
注意:所构造的父类必须满足子类是父类的一种。代码从父类开始写。
六、子类到底可以继承父类的哪些东西
构造方法访问特点
构造方法 非私有 不能 私有不能
1、子类不可以父类的构造方法,但是可以通过super调用。
2、子类构造方法的第一行,有一个默认的super();由虚拟机自动添加,目的是通过父类空参构造初始化成员变量
3、默认先访问父类无参的构造方法,再执行自己的。
4、想要使用父类有参构造,必须自己手动数=书写super(name,age);
成员变量访问特点
就近原则,先从局部位置找,再从本类成员位置找,父类成员位置找,逐级向上。
sout(name)从局部位置开始找name
sout(this.name)从成员位置开始找name
sout(super.name)从父类位置开始找name
逐级往上找,this,super控制了寻找的开始位置。
成员变量 非私有能 私有能
虽然成员变量都可以被继承,但是私有的成员变量无法被调用,只能通过set/get方法调用。
成员方法访问特点
直接调用满足就近原则:谁离我近,我就用谁。
简介调用,super关键字直接访问父类。
成员方法 非私有能 私有不能
成员方法的继承实际上是借用一种虚方法表的方式进行,即非private,非static,非final关键字修饰的方法。每一个子类都会继承父类的虚方法表并加入自己的虚方法,这样设计的方法是为了加速查找的速度。
子类方法和父类方法有时需要设置一样的方法,但方法内部所表达的东西不同,我们会用一种方法名为方法的重写来操作。
七、方法的重写
何时使用
父类的行为不能满足子类的需求
1、重写时方法的名称和形参必须要和父类中的一致。
2、子类重写父类时,子类访问权限必须大于父类(空着不写<protected<public)。
3、子类重写时,返回值的数据类型必须小于父类。
4、建议:重写的方法尽量和父类保持一致。
7、子类重写需要在方法前加上@Override
8、只有加入到虚方法表里面的方法才可以被重写
八、总结
1、继承中成员方法的访问特点
this:就近原则
super:直接找父类
2、什么是方法重写
在继承体系中,子类和父类出现了一摸一样的方法声明,我们就称子类的这个方法是重写的方法。
3、方法重写为什么要加@override
因为可阅读性好,并且可以自动检测重写是否正确。
4、重写有哪些基本要求
1、重写的方法要求基本和父类保持一致
2、只有虚方法表里的方法才可以被重写
5、重写的本质是什么
子类的方法覆盖虚方法表中继承于父类的方法。
九、补充:this和super总结
this:可以理解为一个变量,表示当前方法调用者的地址值。
super:代表父类存储空间
this this.成员变量 this.成员方法(...) this(...)
访问本类成员变量 访问本类成员方法(...) 访问本类其他构造方法
(没有局部变量与成员 (可省略) 主要用来有要求的初始化赋值)
变量重名省略不写)
空参构造时,用this调用实参构造,来初始化成员变量。
public class student{
String name;
int age;
String school;
public Student(){
this(null,0,"北京大学");
}
public Student(String name, int age,String school){
this.name=name;
this.age=age;
this.school=school;
}
}
super super.成员变量 super.成员方法(...) super(...)
访问父类成员变量 访问父类成员方法 访问父类构造方法
(空参,或者实参调用)