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.在这种情况下,拥有一个子类是没有意义的.谢谢大家!
子类构造函数必须调用一些构造函数.如果您还没有告诉它使用哪个,它将使用默认构造函数.
替代方案是让超类中的变量完全未初始化,并且可以通过子类和/或其方法访问,这将非常糟糕.
然而,默认调用默认超类构造函数而不是编译失败的决定是有争议的,但我怀疑它首先与"默认构造函数"的存在联系在一起.
仅供参考,您的问题也表明您可能会对继承感到困惑.该Note.name和Todo.name字段是完全独立的:你不能重写场在子类中,只有方法.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           234 次  |  
        
|   最近记录:  |