这个问题一直困扰着我一段时间,我还没有找到一个好的答案(除了“就是这样”)。
让我给出一些背景代码,以说明我在说什么。
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
那么案例 1 和案例 2 是如何打印出来的:
Note
Todo
这是没有意义的,因为Todo()
(constructor) 不调用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..
}
所以现在这更有意义了,因为当Todo
被创建时,如果super()
没有被插入到封面后面,则不会初始化的Note
方面。Todo
在这种情况下,拥有一个子类是没有意义的。谢谢大家!