JAVA父类和子类的构造函数之间的关系

class SuperClass {
  private int n;
  SuperClass(){ //父类的无参构造器
    System.out.println("SuperClass()");
  }
  SuperClass(int n) { //父类的带参构造器
    System.out.println("SuperClass(int n)");
    this.n = n;
  }
}
class SubClass extends SuperClass{ 
  private int n;
  
  SubClass(){ //子类的无参构造器
    super(300);//调用父类的带参构造器,super(300)相当于SuperClass(300)
    System.out.println("SubClass");
  }  
  
  public SubClass(int n){ //子类的带参构造器
    System.out.println("SubClass(int n):"+n);
    this.n = n;
  }
}
public class TestSuperSub{
  public static void main (String args[]){
    SubClass sc = new SubClass();
    SubClass sc2 = new SubClass(200); 
  }
}

这个实例的输出结果是:

SuperClass(int n)
SubClass
SuperClass()
SubClass(int n):200

从这个实例得到的结果是(个人见解):子类在构造时,会根据主函数中是否传入参数来选择使用无参构造器 or带参构造器,在这个实例中:

当子类调用的是无参构造器时,若父类的构造器是带有参数的,则必须在子类的构造器中显式地通过super关键字调用父类的构造器并配以适当的参数列表。

当子类调用的是带参构造器时,则在子类的构造器中用super调用父类构造器不是必须的,如果没有使用super关键字,系统会自动调用父类的无参构造器。

你可能感兴趣的:(Java)