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。只需设置b1null不会更改任何静态变量。

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

于 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(which is still 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 回答