2010-05-18 164 views
3

爲什麼不下面的程序返回,因爲我從新的A(),它一直沒有主要調用它訪問p訪問變量

public class A { 

     public static int p = 0; 

     public static void main(String[] args) { 

       p = Integer.parseInt(args[0]); 
       new B().go(); 

      } 

     } 


     class B { 
      public void go() { 
       System.out.println(new A().p); 
      } 
     } 
+0

什麼是輸出?任何錯誤? – 2010-05-18 23:39:58

+0

這不會編譯,p是一個成員變量,main是一個靜態方法 – karoberts 2010-05-18 23:40:44

+0

請嘗試發佈這裏似乎有效的問題。我想你甚至沒有試圖檢查程序是否會先編譯。 – Thunderhashy 2010-05-18 23:46:32

回答

2

這甚至不應該編譯。

也許你有p靜態和比你改變它。它現在寫的方式不會編譯。

$ javac A.java 
A.java:7: non-static variable p cannot be referenced from a static context 
      p = Integer.parseInt(args[0]); 
      ^
1 error 

編輯

現在,你已經改正你的代碼的答案是:

這個程序不打印因爲你看到的價值是什麼在第7行中分配。在這種情況下,p是一個類變量。

p = Integer.parseInt(args[0]); 

所以,當你執行:

System.out.println(new A().p); 

,你希望看到0思考「新A」將有它自己的p副本,但事實並非如此。

+0

好的電話。在原始代碼中,p是靜態的。這可能解決了這個問題。 – George 2010-05-18 23:44:08

+0

我想刪除這個問題,但我不能。 – George 2010-05-18 23:49:21

+0

@George:如果你用'0'作爲參數運行它,它打印'0';) – 2010-05-18 23:49:29

0

這應該不會編譯,因爲您試圖從靜態方法分配實例成員。

0

該程序不編譯。編譯器不會讓你從類A的主要方法中訪問'p'。你不能從靜態上下文中訪問非靜態變量。因此編譯問題

+0

即使您將變量'p'定義爲靜態,仍然存在運行時異常'Exception在線程「main」java.lang.ArrayIndexOutOfBoundsException:0' – Thunderhashy 2010-05-18 23:45:05

+0

可能是因爲你不用參數調用代碼? – 2010-05-18 23:52:11

0

這不會編譯原樣,所以我不知道它將如何返回任何東西。

變量p不能從靜態上下文訪問是它應該說的。

如果您設置了p的一個實例,它應該可以正常工作。

ps。對於這一個實驗,我會讓你有一個公共的非最終成員變量,但永遠不會!

0

編輯:這只是一個基於問題的第一次修訂,其中假設p是非靜態的猜測。事實證明,它的意圖是它是靜態的,所以這得到了棒的錯誤結局。

儘管編譯器錯誤,我認爲你的意圖是從非靜態方法來初始化P,或A的一個實例

的問題是,然後你是B中創造的一個新實例,而不是使用原始實例。

得到什麼(我相信)你想,做這樣的事情

public class A { 

     public int p = 0; 

     public static void main(String[] args) { 
       A a = new A(); 
       a.p = Integer.parseInt(args[0]); 
       new B().go(a); 
     } 

    } 


     class B { 
      public void go(A a) { 
       System.out.println(a.p); 
      } 
     } 

注意,在B中的go()方法需要一個作爲參數。沒有創建A的新實例。