1

これは、静的ブロックと静的メソッドを示すためのソース コードです。

class StaticDemo
{
static int count=10;

 StaticDemo(){
 count++;
 }
 static void display(){
  System.out.println(count);
 }

 static{
  System.out.println("Static Block written Before Main");
 }

 public static void main(String args[]){
     StaticDemo t1=new StaticDemo();
     StaticDemo t2=new StaticDemo();

     StaticDemo.display();
     t2.display();

  }
  static{
     System.out.println("Static Block written After Main");
  }
 }

私はの出力を期待しています

Static Block written Before Main 
Static Block written After Main 
11
12

一方、私はの出力を取得します

Static Block written Before Main 
Static Block written After Main 
12
12

静的ブロックは最初に実行されるコード セットであり、したがって最初の 2 つのステートメントの順序であることを理解しています。しかし、JVM が StaticDemo クラスのオブジェクト t1 を作成すると、count の値が 11 ( 10+1 ) にインクリメントされませんか? プログラムで実際に初期化/インクリメントが発生するのはいつですか? ありがとうございました!

4

6 に答える 6

3

main出力は、メソッド内のステートメントの順序によって説明されます。

 StaticDemo t1=new StaticDemo();       //this increments count to 11
 StaticDemo t2=new StaticDemo();       //this increments count to 12

 StaticDemo.display();                 //this outputs 12
 t2.display();                         //this outputs 12

基本的に、2回インクリメントしてから2回出力しているため、結果が得られます。

于 2013-04-24T11:21:16.953 に答える
0

下記参照:

public static void main(String args[]){
             //Initially value of count is 10
             StaticDemo t1=new StaticDemo(); //here it becomes 11
             StaticDemo t2=new StaticDemo(); //here it becomes 12

             StaticDemo.display(); //Now you are printing, it will print 12
             t2.display(); //The value has not changed, so again 12

          }

ブロックを次のように書き換えると:

 public static void main(String args[]){

             StaticDemo t1=new StaticDemo(); 
             StaticDemo.display(); 
             StaticDemo t2=new StaticDemo(); 
              t2.display(); 

          }

次に、出力が 11, 12 と表示されます。

于 2013-04-24T11:22:58.277 に答える
0

@ user2315188..

t1 および t2 オブジェクトを作成しているため、引数のないコンストラクターは 2 回呼び出します。最初のカウント値は 11 で、2 回目はカウント値が 12 になるため、出力 12,12 が得られます。

     StaticDemo t1=new StaticDemo();
     StaticDemo t2=new StaticDemo();
于 2013-04-24T11:28:39.340 に答える