类的继承
面向对象的三大特征:封装、继承、多态
继承:
- 目的:代码的复用性,懒得写代码
- 继承要表达的是一种有关系的类
继承的语法:
对于类的定义而言:
class Animal{} //父类(parent 类)、基类(Base 类)、超类(Super 类)
class Bird extends Animal{} //子类(child)、派生类(Derived class)
继承(方法的覆写 Override)
子类重写了父类的一个方法
- 方法名称相同,形参列表相同,返回值类型要相同(备注)
- 特例:允许返回值类型是父类方法返回类型的子类
List method();
ArrayList method();
- 访问限定符:不能比父类的更封闭
- 方法的重载 Overload -----------方法名称相同,形参列表不同
- 方法的签名:方法名称 + 形参列表
覆写 / 重写 (Override)
一定发生在子类上的,必须实现和父类:
- 方法名称 + 形参列表 + 返回值类型相同的方法
- 目的:针对同一行为,表现出和父类不同的方式
- 访问限定符不能比父类的更严格(封闭)
- 一般建议用 @Override 注解修饰
- IDEA 可以用 generate code 来自动生成
- 和重载(Overload)做好区分
super 关键字
- super 用来访问父类的构造方法
- 不是代表父类对象,可以抽象的去理解,执行属性中属于父类的那部分
- super 不是引用,即明确调用父类的方法
class A {
public int a = 10;
public void print() {sout("父类的 print");}
}
class B extends A {
public int a = 100;
public void print() {sout("父类的 print");}
public void test() {super.a;super.print();}
}
注意:
1.java 中类的继承,只允许单继承
2.父类和子类之间的关系,涉及到 super 关键字
3.类加载的关系
- 子类的加载必须触发父类的加载
- 父类的加载一定是发生在子类的加载之前
- 静态属性的初始化是发生在类的加载时期的
- 父类的静态属性初始化过程一定是发生在子类静态属性初始化之前
4.实例对象化 / 构造的关系
- 子类的对象的构造过程会触发父类中属性的初始化过程
- 父类的属性初始化一定是发生在子类属性的初始化之前
- 属性的初始化:
1.定义时初始化 + 构造代码块按书写顺序
2.构造方法:和 super 调用父类构造方法的位置无关