继承
- 子类继承父类的特征和⾏为,使得⼦类对象具有父类的方法和属性
- 父类也叫基类,具有公共的⽅法和属性,⽣活中的例子
- 动物<-猫
- 动物<-狗
-
extends关键字
class ⽗类名称{
}
class ⼦类名称 extends ⽗类名称{
}
特点
- 子类拥有父类的非private的属性和⽅法
- ⼦类可以⽤自己的方式实现父类的方法 override(重写,覆盖)
- 实现了代码的复⽤
重写从⽗类那里继承来的方法的,当调⽤方法时候会优先调⽤子类的⽅方法(默认就近原则)
注意
不支持多继承,⽀持多重继承,多重继承提高了耦合性,组合优于继承
- 所有的类都是继承于 java.lang.Object
- final关键字
- 修饰的类,则这个类不可以被继承
- 修饰⽅法,则这个⽅法不允许被覆盖(重写)
- after
- 重写父类方法
super关键字
- 一个引⽤变量,⽤于引用父类对象
- 父类和子类都具有相同的命名方法,要调⽤⽗类方法时使用
- 父类和子类都具有相同的命名属性,要调⽤父类中的属性时使用
super也是父类的构造函数,格式 super(参数)
每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错
this()和super()都指的是对象,均不可以在static环境中使用
- 包括:static变量,static方法,static语句句块。
public class Father {
public Father(){
System.out.println("father ⽆无参构造函数");
}
}
class Children extends Father{
public Children(){
//默认存在,写和不不写都⾏行行
super();
System.out.println("Child⽆无参构造函数");
}
}
- 包括:static变量,static方法,static语句句块。
普通继承
- super继承
- 隐式super继承
- 父类构造函数有参,子类构造函数无参,报错
- 父类有参构造会覆盖默认无参构造函数,而子类是无参构造函数,对应的父类没有这种形式的构造函数,那么在编译的时候就会报错
构造函数 super和this
- this 和super在构造函数中只能有⼀个,且都必须是构造函数当中的第⼀行
- 当父类的构造函数是⽆参构造函数时,在子类的构造函数中,不用显式super()去调用⽗类的构造函数,
- 当⽗类的构造函数是有参构造函数时,如果子类的构造函数中不写super()进行调用⽗父类的构造函数,编译器会报错
java继承后类的初始化顺序
- 静态代码块、⾮静态代码、⽗类/子类无参构造方法、父类/子类的一般⽅法
public class Father {
static {
System.out.println("⽗父类静态代码块");
}
public Father(){
System.out.println("father ⽆无参构造函数");
}
public Father(int age){
System.out.println("father 有参构造函数");
}
public void sleep(){
System.out.println("father sleep⽅方法");
}
}
public class Children extends Father{
static {
System.out.println("Child静态代码块");
}
public Children(){
//super();
System.out.println("Child⽆无参构造函数");
super.sleep();
}
public void sleep(){
System.out.println("Child sleep⽅方法");
}
}
public static void main(String[] args) {
new Children().sleep();
}