この質問はしばらくの間私を悩ませてきました、そして私は良い答えを見つけられませんでした(「それがまさにそれである」以外)。
私が話していることを示すために、いくつかのバックグラウンドコードを与えましょう。
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()
サブクラスが親のデフォルトコンストラクターを呼び出さなければならないのはなぜですか?コンストラクターを実装するためにサブクラスを必要としないのはなぜですか?
これに関連するいくつかの質問を読みましたが、理由は誰も答えていません。
編集:
私の例はちょっと貧弱だったと思いますが、実際には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
います。その場合、サブクラスを持つことは無意味です。皆さんありがとう!