如何用java初始化静态变量和静态方法?(用简单的代码)

时间:2015-04-23 11:32:21

标签: java memory methods static

我想知道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,那么

很抱歉,无法找到准确的说明来谷歌。

4 个答案:

答案 0 :(得分:4)

当Java执行代码时,它是从上到下。因此,当它初始化变量时,它从上到下进行。但是,当您读取单位值时,它将为0nullfalse,因为内存首先填充零。注意:类的静态字段有自己的特殊对象,您可以在堆转储中看到它。

所以当你尝试设置

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。

尝试在代码中放置一个静态块。放一些调试点 - 你会自己看看。