1
/* ---------------------- classes --------------- */

public class A {
  public static String str = "compile";
      public A() {
  }
}

public class B {
  public static String str = A.str;

  public B() {
  }
}

/* ----------------------------------------------- */

/* ------------ main class --------------------- */

public class C {

  public static void main(String[] args) {
    A.str = "runtime";
    A a = new A();
    B b = new B();

    // comment at the first, and comment this out next time
    //A.str = "runtime2";

    System.out.println(A.str);
    System.out.println(a.str);
    System.out.println(B.str);
    System.out.println(b.str);
  }
}

/* --------------------------------------------- */

結果はこんな感じ……。

  1. コメント付き : ランタイム ランタイム ランタイム ランタイム

  2. コメントなし : runtime2 runtime2 runtime ランタイム

Aさんの場合はわかりますが、Bさんの場合はわかりません。これについて説明していただけますか?

4

2 に答える 2

2

Aコードにが最初に出現するとA.str、「コンパイル」に初期化されますが、すぐに「ランタイム」で上書きされます。

a次に、 andbインスタンスを宣言します。しかし、これはクラスBが初めて参照される場所であるため、ここで初期化されA.str、現在は「実行時」です。

コメントしたコードでは、

//A.str = "runtime2";

これだけが変わりA.strます。B.str引き続き「ランタイム」を参照します。A.strまた、クラス名またはインスタンスのいずれかを使用して静的変数にアクセスできますa.str

于 2013-03-08T22:00:44.560 に答える
1

Java のクラスは、最初にアクセスしたときにロードされて初期化されます。

したがって、メインメソッドで何が起こるか:

  1. あなたが書くA.str = ...:この時点(割り当てが発生する前)で、クラスAがロードされて初期化され、変数strは文字列を保持します"compile"
  2. A.str = "runtime";古い値"compile"がオーバーライドされた後
  3. A a = new A();何も変わらない
  4. B b = new B();クラスBも読み込まれて初期化されます。の値 のB.str実際の値を取得するA.str

これが最初の出力を説明するものです:runtimeずっと

コメントを外す と、クラス内A.str = "runtime2";の変数のみが変更されます。オンのまま。strAB.strruntime

これが 2 番目の出力の説明です。

于 2013-03-08T22:08:42.530 に答える