为什么不是子类构造函数重写?

Ver*_*ous 0 java

我有代码:

class Oak extends Tree {
    public Oak() {
        System.out.println("Oak()");
    }
}
class Tree {
    public Tree() {
        System.out.println("Tree()");
    }
}

class mainClass {
    public static void main(String[] args) {
        Oak a = new Oak();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么要打印

Tree() 
Oak()
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

Oak()
Run Code Online (Sandbox Code Playgroud)

Oli*_*rth 6

An Oak是一种Tree,因此Tree必须首先构造对象的一部分.因此,将Tree调用默认构造函数.随后,Oak构造函数可以运行.

这完全等同于在Tree构造函数中显式调用构造Oak函数作为第一个语句:

public Oak() {
    super();
    ...
}
Run Code Online (Sandbox Code Playgroud)

[请注意,构造函数不会"覆盖".]


nan*_*ito 5

构造函数永远不会被继承,也永远不会覆盖.这意味着,父元素的构造函数将始终在创建子类的实例时执行.因此,您将获得这两条消息