[英]Accessing variables in other classes (Java)
為什么下面的程序沒有返回0 ,因為我從一個新的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);
}
}
這甚至不應該編譯。
可能你有
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
編輯
現在您已經更正了代碼,答案是:
此程序不打印0,因為您看到的是第7行中指定的值。在這種情況下, p
是一個類變量。
p = Integer.parseInt(args[0]);
所以當你執行:
System.out.println(new A().p);
並且你期望看到0
認為“新A”將擁有它自己的p
副本但事實並非如此。
這甚至不應該編譯,因為您正在嘗試從靜態方法分配實例成員。
這個程序不編譯。 編譯器不允許您從類A的main方法中訪問“p”。您無法從靜態上下文中訪問非靜態變量。 因此匯編問題
那不會按原樣編譯,所以我不知道它會如何返回任何東西。
無法從靜態上下文訪問變量p是它應該說的。
如果設置p的實例,它應該可以正常工作。
PS。 對於這個實驗,我會讓你有一個公共的非最終成員變量,但永遠不會!
編輯:這只是基於問題的第一個修訂的猜測,假設p是非靜態的。 事實證明,意圖是它是靜態的,所以這會得到錯誤的結束。
盡管存在編譯器錯誤,但我假設您的意圖是從非靜態方法或A實例初始化p。
問題是您在B中創建A的新實例,而不是使用原始實例。
為了得到你想要的東西(我相信),做一些類似的事情
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作為參數。 沒有創建A的新實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.