为什么从另一个类访问Java静态字段会给出错误的值


public class Server {
private static boolean msgForAlice=false;
private static boolean msgForBob=false;
public static void shouldAliceWait() {
System.out.println(msgForAlice);
System.out.println(msgForBob);
}
public static void main(String[] args) {
System.out.println("Before:");
System.out.println(msgForAlice);
System.out.println(msgForBob);

try {
Thread.sleep(2000);
}catch(Exception e) {
e.printStackTrace();
}

msgForBob=true;
System.out.println("After:");
System.out.println(msgForAlice);
System.out.println(msgForBob);

try {
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
console.readLine();
}catch(Exception e) {
e.printStackTrace()
}}
public class Test {
public static void main(String[] args) {
Server.shouldAliceWait();
}

}

当Test类的main方法被调用,而Server的main方法正被readLine((调用阻塞时,我从Server的静态字段中得到了不寻常的值:

Server:
Before:
false
false
After:
false
true
Test:
false
false

有人能给我解释一下吗?

这很简单:在Java中,您只能运行一个起点(main方法(。如果您有两个main方法,并且您正在运行每一个方法,则意味着您正在运行程序的两个实例。如果您正在运行程序的两个实例,它们不会共享彼此的信息或变量。

当类Test的主方法被调用,而服务器的主方法正被readLine((调用阻塞时,我从服务器的静态字段中得到不寻常的值:

因此,如果您正在执行此操作,则意味着您必须实例化Java两次——一次是在其自己的空间中实例化第一个main方法,另一次是也在其自己空间中实例化第二个main方法。如果是这样的话,他们就不会分享信息。

最新更新