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