0

これは、「Thinking in Java」の章「Resuing Classes」の Ex18 からのものです。コードは次のとおりです。

 public class E18 {
  public static void main(String[]args)
   {
    System.out.println("First object:");
    System.out.println(new WithFinalFields());
    System.out.println("First object:");
    System.out.println(new WithFinalFields());
   }

  }

class SelfCounter{
 private static int count;
 private int id=count++;
 public String toString()
 {
    return "self counter"+id;
 }

 }

class WithFinalFields
{
  final SelfCounter selfCounter=new SelfCounter();
  static final SelfCounter scsf=new SelfCounter();

      public String toString()
      {
           return "selfCounter="+selfCounter+"\nscsf="+scsf;
      }

}

コードの出力は次のとおりです。

 First object:
 selfCounter=self counter1
 scsf=self counter0

 First object:
 selfCounter=self counter2
 scsf=self counter0

scsf インスタンスは最終的な静的フィールドであると宣言されているため、両方の実行で常に 0 に割り当てられた id を取得する理由を理解できました。私を混乱させるのは、「selfCounter」オブジェクトの ID がそれぞれ 1 と 2 に割り当てられる理由です。別の静的インスタンス変数「count」に基づいて ID の計算がどのように実行されるかについて、少し行き詰まっています。

ご指導ありがとうございます。

4

2 に答える 2

0

ID は 1 と 2 です。これは、3 つのSelfCounter オブジェクトを作成しているためです。これらはすべて、暗黙的にゼロに初期化された同じ count フィールドを共有しています。

1 つ目は、WithFinalFields の静的な SelfCounter です。count フィールドが暗黙的にゼロに初期化され、count++ の値がゼロであるため、その ID はゼロです。

count++ の値が 1 であるため、2 番目の ID は 1 です。そして、count++ の値が 2 であるため、3 番目の ID は 2 です。

于 2013-05-22T02:26:46.660 に答える
0

この変数private static int count;は静的変数で、プログラムの起動時に値が 0 になり、再作成されません。private int id=count++;動的変数です。クラス
の新しいインスタンスが作成される 3 つのケースがあります。そのため、 の 1 回目と 2 回目の起動時の値は、それぞれ 1 と 2 になります。SelfCounter()static final SelfCounter scsf=new SelfCounter();new WithFinalFields()WithFinalFields()

于 2013-05-22T02:28:54.237 に答える