0

静的ブロックは何よりも先に実行されることを知っています。しかし、ここで、B.test() が呼び出されるとどうなるでしょうか? 実行順序と値の設定? 後で、b1 が null に設定された場合でも、b1.i はどのように 20 に評価されるのでしょうか?

class  B
{    
     static int i;
     static {
         i = 20;
         System.out.println("SIB");
     }
     static int test() {  
         int i = 24;
         System.out.println(i);
         return i; 
     }
}

public class Manager {
    public static void main(String[] arg) {
         B.test();
         B b1 = null;
         System.out.println(b1.i);  
    }
}

出力は次のとおりです。

SIB
24
20
4

5 に答える 5

5

iここの価値

static int i;
static {
    i = 20;
    System.out.println("SIB");
}

は 20 に設定されており、変更されていないため、 にアクセスb1.iしても のまま20です。

test()メソッドiでは、静的変数に関連しない別の変数を使用しています。

于 2012-04-19T20:28:26.490 に答える
3

iは静的なので、b1.iと同等B.iです。に設定b1するだけでnullは、静的変数は変更されません。

B.test()呼び出されると、まずBクラスがロードされ、静的ブロックが実行されます。次に、とはまったく異なるB.test()という新しいメソッド ローカル変数を作成します。この新しいローカルが印刷されて返されます。に変更は加えられませんこれは、null である新しいオブジェクト参照を作成したという理由だけでなく、何にも影響を与えません。iB.iiB.iB

于 2012-04-19T20:26:23.717 に答える
1

しかし、ここで、B.test() が呼び出されるとどうなるでしょうか? 実行順序と値の設定?

変更はありません。

後で、b1 が null に設定された場合でも、b1.i はどのように 20 に評価されるのでしょうか?

使用されていないためb1、フィールドは静的であるため、実際に使用していますB.i

于 2012-04-19T20:28:11.830 に答える
1

何が起こるか:

  • B.test()実際に実行する前に、初めて呼び出されます。
  • クラスBがロードされ、
  • 静的イニシャライザが実行されました (B.i = 20今)
  • メソッドの内容B.test()が実行される
  • int i = 24(静的変数をシャドウするメソッドローカルを作成し、B.iそれを出力します)
  • b1.iとして解釈されB.i(これはまだ20)、印刷されます。
于 2012-04-19T20:30:50.610 に答える
1
What you did:             What really happened:
B.test()                  - static block of class B is run, static i set to 20, SIB is displayed
                          - test method is called, local property i set to 24, 24 is displayed
b1 = null                 - set reference for b1 to null. Note that this doesn't change the value of class B's static properties
System.out.println(b1.i)  - b1 is still Class B. It doesn't matter what its current reference is. Static i for class B is still 20, 20 is displayed
于 2012-04-19T20:35:34.167 に答える