2

奇妙ですが、この質問の重複が見つかりません。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 を返します。

4

2 に答える 2

2

はい、コンストラクターが呼び出される前にフィールドが初期化されます。これは、オーバーロードするクラスの前の上位クラスから始まります。

ここに一般的なプレゼンテーションがあります: http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ306_014.htm

于 2012-06-18T09:24:33.807 に答える