22

些細な構文エラーなどで申し訳ありませんが、私は Jitsi モジュールでこれを経験しており、Java にあまり慣れていないため、何が起こっているのか、なぜ、どのように修正する必要があるのか​​を確認したいと考えています。

 public abstract class A
{
  public A()
  {
    this.load();
  }

  protected void load()
  {

  }
}

public class B extends A
{
  private String testString = null; 

  public B()
  {
    super();
  }

  @Override
  protected void load()
  {
    testString = "test";
  }
}

アプリケーションは、load class by name メソッドを使用してクラス B のインスタンスを作成するときにこれを実行します。

  • クラス B でオーバーライドされた load() を呼び出す
  • 変数を初期化し (デバッガーに従って「プライベート文字列 testString = null」を呼び出します)、それらを無効にします。

これは予期された Java の動作ですか? 何が原因でしょうか? これは、1.7 JDK で実行される Java 1.6 アプリケーションです。

4

2 に答える 2

59

これは予期された Java の動作ですか?

はい。

何が原因でしょうか?

非最終スーパー クラス コンストラクターでの非最終オーバーライド メソッドの呼び出し。

何が起こるかを段階的に見てみましょう。

  • のインスタンスを作成しますB
  • B()スーパー クラス コンストラクター - を呼び出しA()て、スーパー クラス メンバーを初期化します。
  • A()B初期化の一部として、クラスでオーバーライドされる非最終メソッドを呼び出すようになりました。
  • コンテキスト内のインスタンスはクラスであるため、呼び出されるBメソッドはクラスです。load()B
  • load()Bクラス インスタンス フィールドを初期化します - testString.
  • スーパークラスのコンストラクターはジョブを終了し、戻ります (クラスまでのコンストラクターの連鎖がObject終了したと仮定します)
  • B()コンストラクターはさらに実行を開始し、独自のメンバーを初期化します。
  • ここで、初期化プロセスの一環としてB、以前に に書き込まれた値を上書きしtestString、 に再初期化しnullます。

道徳:コンストラクターで、非最終クラスの非最終パブリック メソッドを呼び出してはいけません。

于 2013-08-09T00:31:55.233 に答える