2017-08-15 5 views
-5
class Welcome{ 
     public static void main(String args[]){ 
      System.out.println(Hello.a); 
     } 
    } 
    class Hello{ 
     static int a=10; 
     static Hello h=new Hello(); 
     { 
      System.out.println("IB"); 
     } 
     static{ 
      System.out.println("SB"); 
     } 
    } 

出力:このJavaプログラムはどのように実行されますか?

IB 
SB 
10 

私は本当にこの実行の背後にあるロジックを理解していません。私によれば、静的変数は初期化され、静的ブロックは実行されます。インスタンス変数が初期化され、インスタンスブロックが実行されます。

しかし、これはちょっと混乱しているようです。実際の実行のステップバイステップの順序が与えられれば、大きな助けになるでしょう。

static Hello h=new Hello();の意味はなんですか?

これはどのように処理されますか?

+0

どのような方法(複数可)で、あなたの説明が出力に適合していないのですか? –

+0

各データフィールドをクラスのプライベートメンバーとしてカプセル化する必要があるオブジェクト指向プログラミングの方法に従ってください。 – abcOfJavaAndCPP

答えて

3

キーワードclassを修正して実行しました。あなたがそれが走っているのを見ると、実行はかなり前進しています。

  1. スタティック変数が初期化されます。つまり、aとが設定されています。
  2. 初期化ブロックが実行されます。 "IB"が印刷されます。 hの値が新しいHelloオブジェクトであるために実行されます。 これは、hがクラスのstaticイニシャライザブロックの前に定義されているために発生します。コード内に表示される順序を変更すると、実行順序が変更されます。

  3. スタティック初期化ブロックが実行されます。 "SB"が印刷されます。

  4. メインメソッドが呼び出され、Hello.aが出力されます。したがって10が印刷されます。

IDEOneリンクhttp://ideone.com/KfdS6n

+0

部分的に正しいだけです。インスタンスの初期化子は静的なイニシャライザ*の前に 'new Hello()'がテキストの順番で現れるため*実行されます*。静的ブロックの後に 'new Hello()'を並べ替えてください。変更する必要があります。 – chrylis

+0

あなたのコメントを見た直前に私の説明からこれを省略したことに気付きました。私の答えは修正されました。編集:あなたのフィードバックに基づいて少し明確にしました。 – christopher

関連する問題