我知道静态变量只在一次加载而不是每个对象时创建和初始化。
在下面给出的代码中,我要做的是:我在类A中将一个int变量“a”声明为静态,并为其赋值为5.执行main时,我将其值更改为6并制作程序无限循环。所以目前“a”值是6.
现在我试图做的是当A类仍在循环时我试图从其他类B访问这个变量,我期望在运行B类时应该打印6(因为当我运行B类时“一个“价值变为6”但令人惊讶的是它仍然给了我5.
为什么即使我将“a”声明为静态也会发生这种情况?无法弄清楚这种方法有什么问题。
class A{
static int a=5;
public static void main(String args[]){
System.out.println(A.a+"");
a=6;
while(true){
}
}
}
class B{
public static void main(String args[]){
System.out.println(A.a+"");
}
}
答案 0 :(得分:4)
您遇到的问题是您正在运行两个不同的JVM进程。你应该做的是在自己的线程中运行每个“main”方法。这样他们共享(因此可以修改)相同的内存。以下是修改为使用线程的示例:
public class Main{
public static int v = 5;
public static void main(String[] args) throws Exception{
new Thread(new A()).start();
Thread.sleep(5000);
new Thread(new B()).start();
}
}
class A implements Runnable{
public void run(){
System.out.println(Main.v);
Main.v = 6;
}
}
class B implements Runnable{
public void run(){
System.out.println(Main.v);
}
}
旁注:虽然这个示例确实展示了问题的预期,但在编写使用多个线程的正确 Java程序方面仍然存在许多问题。做你的研究。
答案 1 :(得分:0)
你永远不会在A中运行主循环。
只需创建一个方法来更改值。
答案 2 :(得分:0)
这是因为从不调用A的主要方法。
答案 3 :(得分:0)
您正在运行两个java进程和两个程序。第二个类加载器加载class A
并将其静态变量设置为5,但class B
中没有调用来调用class A
中定义的静态main()方法,将其增加到6。