让我们有三个名为Tester_1
,Tester_2
,Tester_3
的课程。它们被定义为:
Tester_1:
class Tester_1 {
public static void main(String args[]) {
Tester_2.setBoolean(true);
System.out.println(Tester_2.getBoolean());
}
}
Tester_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;
}
}
Tester_3:
class Tester_3 {
public static void main(String args[]) {
System.out.println(Tester_2.getBoolean());
}
}
在编译完所有三个类之后,我按以下顺序运行它们:
java Tester_1
java Tester_3
但我得到了这个输出:
第一次运行时 true ,第二次运行时 false 。这是为什么 ?当Tester_1将布尔值设置为值true
时,为什么在运行Tester_3时会得到默认值false
?
答案 0 :(得分:7)
static
仅在Java虚拟机(JVM)级别有效。
每次拨打java xxx
时,您都会创建一个新的JVM,该JVM与之前的呼叫不共享任何内容=>所有静态变量都会再次获得默认值。
答案 1 :(得分:1)
因为静态变量在JVM中静态保存它们的值,但不是跨JVM保持的。一旦JVM进程退出,它的内存中的变量值就会被破坏。当第二个JVM启动时,所有内容都会重新初始化。
如果需要在运行期间保留值,则必须将它们保存在某处(例如,文件系统或数据库)。
答案 2 :(得分:0)
只是因为你正在运行两个不同的过程。意味着您有两个不同的主电源,这意味着它将有两个不同的执行路径。
每个进程都会创建新的JVM,以便在1st中有效的静态变量在第二个JVM中不起作用。
答案 3 :(得分:0)
两次单独的执行 - >不同的结果。
JVM使其更有趣,因为它会删除每次执行的先前数据。
答案 4 :(得分:0)
java Tester_1
这是第一轮计划。 (即一个过程)
java Tester_3
这是第二轮计划。 (另一个过程)
static
值在流程中持续存在。不是跨过程。