首先是一些术语:无参数构造函数:无参数的构造函数;可访问的无参数构造函数:超类中的无参数构造函数对子类可见。这意味着它是公共的或受保护的,或者,如果两个类都在同一个包中,则访问包;和默认构造函数:类中没有显式构造函数时,编译器添加的公共no-args构造函数。因此,所有类都至少具有一个构造函数。子类的构造函数可以在执行子类的构造函数中的代码之前,首先指定要调用超类中的哪个构造函数。如果子类构造函数未指定要调用的超类构造函数,则编译器将自动调用超类中可访问的no-args构造函数。如果超类没有no-arg构造函数或不可访问,则未指定要调用的超类构造函数(在子类构造函数中)是编译器错误,因此必须指定。例如:public class Base { }public class Derived extends Base { }这很好,因为如果不显式添加构造函数,则Java会为您放置一个公共的默认构造函数。public class Base { }public class Derived extends Base { public Derived(int i) { } }还可以public class Base { public Base(String s) { } }public class Derived extends Base { }上面是编译错误,因为Base没有默认构造函数。public class Base { private Base() { } }public class Derived extends Base { }这也是一个错误,因为Base的no-args构造函数是私有的。
即使不调用子默认构造函数,也会调用默认父构造函数。主要public class Main { public static void main(String[] args) { A a = new B(); }}一种public class A { public A() { System.out.println("A"); }}乙public class B extends A { public B() { System.out.println("B"); }}版画AB