奇妙ですが、この質問の重複が見つかりません。overrideMe() メソッドを持つスーパークラスとそれをオーバーライドするサブクラスがあります。サブクラスのコンストラクターが呼び出される前に、最終フィールドは本当に初期化されていますか? 出力からわかるように、そうです。
出力は次のとおりです。 スーパークラスの const str 値: someValue サブクラスの constr str 値: someValue
これについて説明していただけますか?インスタンス変数はコンストラクター呼び出し内で初期化されますが、その前ではないと思いました。
コードは次のとおりです。
public class Test {
public Test() {
System.out.println("Superclass constr");
overrideMe();
}
public void overrideMe() {
}
}
class Ext extends Test {
private final String str = "someValue";
public Ext() {
System.out.println("Subclass constr");
}
@Override
public void overrideMe() {
System.out.println("str value: " + str);
}
public static void main(String[] args) {
Ext test = new Ext();
test.overrideMe();
}
}
編集: str フィールドを非最終として宣言すると、コンストラクターでのサブクラス呼び出しは期待どおりに null を返します。