Java 面向对象编程之继承的super关键词

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();
    }

猜你喜欢

转载自www.cnblogs.com/chenyanbin/p/13377491.html