继承
所谓继承是指一个类的定义可以基于另外一个已经存在的类,即子类基于父类,从而实现父类代码重用。子类能够吸收已有类的属性和行为,并能够扩展新的能力。
1. 继承的声明形式
[访问修饰符] [修饰符] class 类名 extends 父类{
//代码
}
public class Animal {
private String name ; // 使用private修饰的内容无法被继承
private int age ;
public Animal() {} // 构造方法无法被继承。
//省略getter/setter方法
public void eat() {
//代码段
}
}
public class Dog extends Animal{
public Dog(){}
}
2. 继承的执行顺序
main(){
Dog dog = new Dog() ;
}
- 对dog对象进行实例化
- 初始化父类中的所有全局变量
- 调用父类的构造方法,并且实例化父类对象
- 调用子类的构造方法,实例化子类对象
3. 继承的优点
- 提高代码的复用性:多个类相同的成员可以放在同一个类中。
- 提高了代码的可维护性:如果功能代码需要修改,只需要修改一处即可。
- 让类与类之间产生了关系,是多态的前提
4. 继承的注意事项
- 继承是单继承,不能够多继承关系
- 实现多层继承,但是不建议大量使用
- 子类只能继承父类所有非私有的成员(成员方法和成员变量)
- 子类不能继承父类的构造方法,但是可以通过super关键字去
访问
父类构造方法。 - 不要为了部分功能而去继承
- 继承中类之间体现的是:”is-a”的关系和"has-a"关系。(…是…的一种)
5. super关键字
this关键字是指向于自身的一颗指针,能够获取当前对象的所有非静态成员。(成员变量以及成员方法)
super关键字是指向于父类的一颗指针,因此通过super无法访问本类中的非静态成员,可以通过super实现对父类非静态成员的调用,还能够通过super实现父类的构造方法调用。
//通过子类调用父类的构造方法
public Dog() {
//在第一行写调用
super() ;
}
public void show() {
super.父类的字段[前提是非private的]
super.setter/getter方法
super.方法() ;
}
super注意点:
1.super调用父类的构造方法,必须在构造方法的第一个
2.super必须只能出现在子类的方法或者构造方法中
3.super和this不能同时调用构造方法
Vs this:
代表的对象不同:
this:本身调用这个对象
super:代表父类对象的应用
前提:
this:没继承也可以使用
super:只能在继承条件下才可以使用
构造方法:
this():本类的构造
super():父类的构造
6. 方法覆盖\重写(Override)
子类可以重写父类中某一个方法,称为方法覆盖,也称方法重写,是继承中非常重要的知识点。如果子类需要修改从父类继承到的方法的方法体,就可以使用方法覆盖。
6.1 方法重写的特点:
- 在子类中实现方法的重写(至少有两个类,而且是继承性关系)
- 方法名、返回值、参数列表必须相同
- 子类方法访问修饰符不能比父类的可访问权限更小 :public>protected>default>private
- 子类不能够抛出比父类更多的异常
位置 | 方法名 | 参数表 | 返回值 | 访问修饰符 | |
---|---|---|---|---|---|
方法重写 | 子类 | 相同 | 相同 | 相同或是其子类 | 不能比父类更严格 |
方法重载 | 同类 | 相同 | 不相同 | 无关 | 无关 |
为什么需要重写:
1.父类的功能,子类不一定需要,或者不一定满足。