为什么编译器会抱怨 superclass 没有构造函数,而默认构造函数是 'automatically' 给没有构造函数的 class?

Why does compiler complain that superclass has no constructor, when the default constructor is 'automatically' given to a class with no constructor?

All classes have at least one constructor. If a class does not explicitly declare any, the Java compiler automatically provides a no-argument constructor, called the default constructor. This default constructor calls the class parent's no-argument constructor, or the Object constructor if the class has no other parent. If the parent has no constructor (Object does have one), the compiler will reject the program.

(source)

但是,Object 是 Java 中每个 class 的(直接或间接)超 class。

假设,我们有一个 class A,它没有显式地扩展任何 class,所以它隐式地扩展了 Object。另外假设,A没有显式提供构造函数,所以编译器自动给它添加一个默认的构造函数,它会调用它的superclass、Object(和Object 确实有一个构造函数)。

现在假设我们有一个 class B 扩展了 class A,并且它没有提供显式构造函数,所以编译器会自动为它提供一个默认构造函数;此默认构造函数尝试从 A.

调用构造函数

现在为什么编译器 B 中出现编译器错误,而编译器 A 提供了一个(默认)构造函数(正在调用 Object 的构造函数,而 Object 有一个)?


编辑:

测试:编译成功! 这是否意味着教程中的最后一句话不正确?

class A extends B {
    public static void main(String [] args) {
        //A a = new A();
        System.out.println("Yayyy");
    }
}

class B {
}

首先是一些术语:

  • 无参数构造函数: 没有参数的构造函数;
  • 可访问的无参数构造函数: superclass 中的无参数构造函数对 subclass 可见。这意味着它要么是 public 要么是受保护的,或者,如果两个 class 都在同一个包中,则包访问;和
  • 默认构造函数:当class.[=44=中没有显式构造函数时,编译器添加的public无参数构造函数]

因此所有 classes 至少有一个构造函数。

Subclasses 构造函数 可以 指定在执行 sub 中的代码之前首先调用 superclass 中的哪个构造函数class 的构造函数。

如果 subclass 构造函数没有指定要调用哪个 superclass 构造函数,那么编译器将自动调用 superclass 中可访问的无参数构造函数。

如果 superclass 没有无参数构造函数或者它不可访问则不指定要调用的 superclass 构造函数(在 subclass 构造函数中)是一个编译器错误,所以它 必须 被指定。

例如:

public class Base { }
public class Derived extends Base { }

这很好,因为如果您没有显式添加构造函数,Java 会为您放入一个 public 默认构造函数。

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 的无参数构造函数是私有的。