2

我知道静态变量只在加载类时创建和初始化一次,而不是每个对象。

在下面给出的代码中,我想要做的是:我在类 A 中将一个 int 变量“a”声明为静态,并为其赋值 5。当 main 执行时,我将其值更改为 6,并使程序无限循环。所以目前“a”值为6。

现在我尝试做的是,当 A 类仍在循环时,我尝试从其他类 B 访问此变量,并且我希望在运行 B 类时应该打印 6(因为当我运行 B 类“a”值时)改为 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+"");
    }
}
4

4 回答 4

4

您遇到的问题是您正在运行两个不同的 JVM 进程。您应该做的是在自己的线程中运行每个“主要”方法。这样他们共享(因此可以修改)相同的内存。这是您修改为使用线程的示例:

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 程序方面仍然存在很多问题。做你的研究。

于 2012-05-21T17:50:41.493 回答
1

您正在运行两个 java 进程和两个程序。第二个类加载器加载class A并将其静态变量设置为 5,但没有调用class B调用其中定义的class A将其增加到 6 的静态 main() 方法。

于 2012-05-21T17:44:25.353 回答
0

你从来没有真正在 A 中运行主循环。

只需制作一种方法来更改值。

于 2012-05-21T17:41:04.243 回答
0

那是因为 A 的 main 方法永远不会被调用。

于 2012-05-21T17:42:21.763 回答