2012-05-21 71 views
2

我知道静态变量的创建和初始化只有一次I.e当类加载,而不是每个对象。在Java中静态变量的使用

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

现在我试图做的是我试图从其他类B类访问此变量时,类A仍然循环,我期望应该打印6当我跑B类(因为当我跑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

您正在通过'A.main'和'B.main'运行两个独立的程序。您必须在同一个流程中使用线程来展示您期望看到的内容。 –

+1

或更好 - 静态初始化块。 –

+0

我不认为线程是必要的。在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程序方面的很多东西不对的使用多个线程。做你的研究。

+0

你对我试图加载这两个程序在不同的过程中是错误的。谢谢! – user1406427

0

你从来没有真正运行的主循环A.

只是要改变值的方法。

+0

我首先运行A类,所以“a”值应该改为6.之后,当A在while循环中被触发时,我试图访问B中的“a”,我得到了5个答案。 – user1406427

+0

你首先在哪里运行“A”?你将不得不在同一个班上跑这两个,以得到你想要的。它们现在仍然是两个独立的对象,它们之间没有任何关系。所以你只是访问变量,并没有真正改变它,然后用B访问它。 – OmniOwl

+0

你对我试图加载两个程序在不同的进程中是错误的。谢谢! – user1406427

0

这是因为A的主要方法永远不会被调用。

0

您正在运行两个java进程和两个程序。第二类加载器加载class A并设置它的静态变量至5但在class B没有呼叫来调用在class A定义的静态主()方法,它增加至6

+0

你对我试图加载这两个程序在不同的过程中是错误的。谢谢! – user1406427