执行顺序,静态块,字段

时间:2012-04-19 20:24:36

标签: java static block

我知道静态块在任何事情之前运行。但是在这里,当调用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

5 个答案:

答案 0 :(得分:5)

此处i的值

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

设置为20且从未修改,因此当您访问b1.i时,它仍然是20

在您的test()方法中,您使用的另一个i变量与静态变量无关。

答案 1 :(得分:3)

i是静态的,因此b1.i相当于B.i。只需将b1设置为null,就不会更改任何静态变量。

调用B.test()时,首先加载B类,然后运行静态块。接下来,B.test()创建一个名为i的新方法局部变量,它与B.i完全不同。打印并返回此新的本地i。不会对B.i进行任何更改,而当然不仅因为您创建了一个空的新B对象引用 - 这对任何事情都不会产生任何影响。

答案 2 :(得分:1)

  

但是在这里,当调用B.test()时会发生什么?执行顺序和值的设定?

没有变化。

  

稍后,当b1设置为null时,b1.i的计算结果仍为20?

由于未使用b1,因此该字段是静态的,因此您实际上正在使用B.i

答案 3 :(得分:1)

会发生什么:

  • B.test()在实际运行之前第一次被调用:
  • 已加载班级B
  • 执行静态初始化程序(现在B.i = 20
  • 执行B.test()方法的内容
  • (创建方法本地int i = 24(隐藏静态变量B.i)并打印它)
  • b1.i被解释为B.i(仍为20),并且已打印出来。

答案 4 :(得分: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