【发布时间】:2012-12-19 22:00:31
【问题描述】:
这个问题一直困扰着我一段时间,我还没有找到一个好的答案(除了“就是这样”)。
让我给出一些背景代码,以说明我在说什么。
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()(构造函数)不调用super()(至少不可见)。为什么子类必须调用父类的默认构造函数,为什么不要求任何子类实现构造函数?
我读了几篇与此相关的questions,但没有人回答为什么。
编辑:
我想我的例子有点糟糕,但它实际上是 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() 没有被插入到封面后面,Todo 的 Note 方面将不会被初始化。在这种情况下,拥有一个子类是没有意义的。谢谢大家!
【问题讨论】:
-
对我来说,它会打印出
Note Todo Note Todo,这是有道理的,因为您在这两种情况下都按顺序创建了Note和ToDo。 -
我确实提到那是输出,但问题是:为什么默认调用父类的默认构造函数。
-
因为每个对象都必须构造! (如Every Sperm is Sacred)
标签: java oop constructor subclass