为什么子类默认调用super()?

kno*_*lya 2 java oop constructor subclass

这个问题一直困扰着我一段时间,我没有找到一个好的答案(除了"那就是它是如何").

让我给出一些背景代码,以显示我在说什么.

class Note {
    private final String name = "Note";

    public Note() {
        System.out.println(name);
    }
    // ...
}

class Todo extends Note {
    private final String name = "Todo";

    public Todo() {
        System.out.println(name);
    }
    // ...
}

// ...
Note note = new Todo(); // case 1
Todo todo = new Todo(); // case 2
Run Code Online (Sandbox Code Playgroud)

那么案例1和案例2如何打印出来:

Note
Todo
Run Code Online (Sandbox Code Playgroud)

这是没有意义的,因为Todo()(构造函数)不调用super()(至少不可见).为什么子类必须调用父默认构造函数,为什么不只需要任何子类来实现构造函数?

我读了几个与此相关的问题,但没有人回答为什么.

编辑:
我想我的例子有点差,但它实际上是Java 7认证问题的衍生物.从答案的集合我现在明白为什么.让我提供一个更好的例子:

public Note {
    private String description;

    public Note() {
        description = "I'm a Note";
    }

    public Note( String description ) {
        this.description = description;
    }

    // getters/setters/etc.
}

public Todo extends Note {
    // field vars..

    public Todo() {
        // empty constructor
    }

    // getters/setters/etc..
}
Run Code Online (Sandbox Code Playgroud)

所以现在这更有意义,因为在Todo创建时,如果super()没有插入封面后面,则不会初始化该Note方面Todo.在这种情况下,拥有一个子类是没有意义的.谢谢大家!

Lou*_*man 7

子类构造函数必须调用一些构造函数.如果您还没有告诉它使用哪个,它将使用默认构造函数.

替代方案是让超类中的变量完全未初始化,并且可以通过子类和/或其方法访问,这将非常糟糕.

然而,默认调用默认超类构造函数而不是编译失败的决定是有争议的,但我怀疑它首先与"默认构造函数"的存在联系在一起.

仅供参考,您的问题也表明您可能会对继承感到困惑.该Note.nameTodo.name字段是完全独立的:你不能重写在子类中,只有方法.