java 继承里面的super关键词
super关键词
- 一个引用变量,用于引用父类对象
- 父类和子类都具有相同的命名属性,要调用父类中的属性时使用
- super也是父类的构造函数,格式super(参数)
- 注意点,调用super()必须是类构造函数中的第一个语句,否则编译不通过
- 注意
- 每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错
public class Father { public Father(){ System.out.println("father ⽆参构造函数"); } } public class Children extends Father{ public Children(){ //默认存在,写和不写都⾏ super(); System.out.println("Child⽆参构造函数"); } }
- this()和super()都指的是对象,均不可以在static环境中使用
- 包括:static变量,static方法,static代码块
- 构造函数super和this
- this和super在构造函数中只能有一个,且都必须是构造函数当中的第一行
-
- 当父类的构造函数是无参构造函数时,在子类的构造函数中,不用显式super()去调用父类的构造函数
-
- 当父类的构造函数是有参构造函数时,如果子类的构造函数中不写super()进行调用父类的构造函数,编译器会报错
Java继承后类的初始化顺序
问题:静态代码块、非静态代码块、父类/子类无参构造函数、父类/子类的一般方法
class Teacher { static { System.out.println("Teacher 静态代码块"); } public Teacher() { System.out.println("Teacher 无参构造函数被执行"); } public Teacher(int age) { System.out.println("Teacher 有参构造函数被执行"); } public void sleep() { System.out.println("Teacher中的sleep被调用"); } } public class Student extends Teacher{ static { System.out.println("Student 静态代码块"); } public Student() { super(); System.out.println("Student 无参构造被执行"); super.sleep(); } public void sleep() { System.out.println("Student中的sleep被调用"); } } public static void main(String[] args) { new Student().sleep(); }