我想知道java如何初始化这些静态变量。 我无法理解的代码显示为:
public class Main {
static int first=test();
static int second=2;
static int third=test();
public static void main(String[] args) {
System.out.println(first);
System.out.println(second);
System.out.println(third);
}
public static int test() {
return second;
}
}
以下简单代码的输出为0 2 2
如果编译器在定义之前自动忽略非可执行方法或静态变量为0,那么
很抱歉,无法找到准确的说明来谷歌。
答案 0 :(得分:4)
当Java执行代码时,它是从上到下。因此,当它初始化变量时,它从上到下进行。但是,当您读取单位值时,它将为0
,null
或false
,因为内存首先填充零。注意:类的静态字段有自己的特殊对象,您可以在堆转储中看到它。
所以当你尝试设置
时first = 0; // second hasn't been set yet
second = 2;
third = 2; // second has been set to 2.
添加方法只会阻止编译器检测到您在初始化之前尝试使用变量。
答案 1 :(得分:0)
这可能会对你有帮助。
// executing order top to bottom
static int first=test();//test() will return value of second still second is 0
static int second=2;//now second will be 2
static int third=test();//test() will return current value of second, which is 2
public static void main(String[] args) {
System.out.println(first);// so this will be 0
System.out.println(second); // this will be 2
System.out.println(third); // this will be 2
}
public static int test() {
return second;
}
答案 2 :(得分:0)
您可以通过在其中放入一些print语句来测试编译器是否忽略了非可执行方法
public static int test() {
System.out.println("Test exceuted")
return second;
}
现在您的输出可能是:
Test exceuted
Test exceuted
0
2
2
这表明我们已经执行了该方法,但由于第二次尚未初始化,因此第一次返回0。
答案 3 :(得分:0)
让我们尝试从JVM角度理解事物:
正在加载 - JVM查找具有特定名称的Type(类/接口)的二进制表示,并从该二进制表示创建类/接口。 静态成员(变量/初始化块)在类加载期间加载 - 按照它们在代码中的出现顺序。
这里,作为加载的一部分 - 静态成员按发生顺序执行。方法test()
被调用两次;但第一次,变量second
刚刚声明,未定义(初始化) - 因此默认为0.之后,它获得值2并打印 - 0 2 2。
尝试在代码中放置一个静态块。放一些调试点 - 你会自己看看。