在Java中使用静态变量

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

在下面给出的代码中,我试图做的是:我在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+"");
    }
}
2
额外 编辑
意见: 1
您正在通过 A.mainB.main 运行两个单独的程序。您必须在同一个流程中使用线程来展示您期望看到的内容。
额外 作者 Steve Townsend,
或者更好 - 一个静态初始化块。
额外 作者 Hovercraft Full Of Eels,
我不认为线程是必要的。在B中; `pubic static void main(String [] args){A。主要(args);系统。出去。 println(A。a +“”); }
额外 作者 emory,

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

4
额外
你是对的我试图加载两个程序在不同的过程中是错误的。谢谢!
额外 作者 user1406427,

你从未真正运行过A中的主循环。

只需制作一个方法来改变这个值。

0
额外
你在哪里首先运行“A”?你将不得不在同一个班上跑这两个,以得到你想要的。它们现在仍然是两个独立的对象,它们之间没有任何关系。所以你只是访问变量,而不是真正改变它,然后用B访问它。
额外 作者 OmniOwl,
我首先运行A类,因此“a”值应该改为6.之后,当A在while循环中被触发时,我试图访问B中的“a”,我得到了5个答案。
额外 作者 user1406427,
你是对的我试图加载两个程序在不同的过程中是错误的。谢谢!
额外 作者 user1406427,

这是因为A的主要方法从不被调用。

0
额外

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

0
额外
你是对的我试图加载两个程序在不同的过程中是错误的。谢谢!
额外 作者 user1406427,