3

设三个类名为Tester_1, Tester_2, Tester_3。它们被定义为:

测试员_1:

class Tester_1 {

 public static void main(String args[]) {
    Tester_2.setBoolean(true);
    System.out.println(Tester_2.getBoolean());
 }
}

测试员_2:

class Tester_2 {

public static boolean var = false; // Static var

public static void setBoolean(boolean value) {
   var = value;
}

public static boolean getBoolean() {
    return var;
}

}

测试员_3:

class Tester_3 {
public static void main(String args[]) {
    System.out.println(Tester_2.getBoolean());
}
}

编译完所有三个类后,我按以下顺序运行它们:

java Tester_1

java Tester_3

但我得到这个输出:

第一次运行为真,第二次运行为。这是为什么 ?当 Tester_1 将布尔值设置为一个值时true,为什么我false在运行 Tester_3 时会获得默认值?

4

5 回答 5

7

static仅在 Java 虚拟机 (JVM) 级别有效。

每次调用时,java xxx您都会创建一个新的 JVM,它不会与之前的调用共享任何内容 => 所有静态变量都会再次获得它们的默认值。

于 2013-01-07T12:54:08.250 回答
1

因为静态变量在 JVM 中静态保存它们的值,而不是跨 JVM 保存。一旦JVM进程退出,它在内存中的变量值就会被销毁。当第二个 JVM 启动时,一切都会重新初始化。

如果您需要在运行中保留值,则必须将它们保存在某个地方(例如,保存到文件系统或数据库)。

于 2013-01-07T12:54:42.150 回答
0

java Tester_1

这是程序的第 1 次运行。(即一个过程)

java Tester_3

这是程序的第二次运行。(另一个过程)

static价值观在一个过程中持续存在。不是跨进程。

于 2013-01-07T12:58:22.067 回答
0

仅仅因为您正在运行两个不同的进程。意味着您有两个不同的主电源,这意味着它将有 2 个不同的执行路径。

每个进程都会创建新的 JVM,以便您在第一个有效的静态变量在第二个 JVM 中不起作用。

于 2013-01-07T12:55:35.557 回答
0

两个单独的执行-> 不同的结果。

JVM 让它变得更有趣,因为它每次执行都会删除以前的数据。

于 2013-01-07T12:56:35.143 回答