2013-02-06 57 views
2

好了,所以basiclly我有三類:在另一個類訪問變量返回null

  • 主類
  • 蘋果(兩個構造函數)

在主類怎麼辦:

Apple apple = new Apple(String one, String two); 

然後Apple類設置它們全球:

public Apple() 
{ 
    //empty constructor 
} 
public Apple(String one, String two) 
{ 
    this.one = one; 
    this.two = two; 
} 

然後在餅類我做的:

Apple apple = new Apple(); 

然後,如果我嘗試從他們返回null餅圖類訪問的變量「一」或「二」。有人能幫我嗎?

+1

看起來你並沒有在Apple類中設置一個或兩個varialbes。另外,公共變量是IMO的一個值得懷疑的設計。 –

+0

你有兩個獨立的同一類'Apple'的對象。一旦您設置了一個對象的某些字段,另一個對象的字段保持不變。 –

回答

8

你正在創建兩個不同的對象。如果您希望所有Apple對象具有相同的參數,請將它們聲明爲static。否則,行爲是正確的。

更具體地說,您在主類創建apple,將在它的參數所需的值。第二apple,即在Pie類被創建(並且它是一個不同對象即蘋果類的其他實例),因爲它不帶任何參數構成,所以默認的構造(即public Apple())將被調用,並且這些值將返回null。

要查看staticnon-static變量之間的區別執行以下操作:

class Apple { 
    int var; 
} 

Apple apple1 = new Apple(); 
apple1.var = 10; 
Apple apple2 = new Apple(); 
apple2.var = 5; 
System.out.println(apple1.var+"\t"+apple2.var); 

打印:

10  5 

但如果這是static你會得到

class Apple { 
    static int var; 
} 

Apple apple1 = new Apple(); 
apple1.var = 10; 
Apple apple2 = new Apple(); 
apple2.var = 5; 
System.out.println(apple1.var+"\t"+apple2.var); 

輸出將是:

5  5 

有關何時使用靜態或沒有更多的信息,看看:

Java: when to use static methods

+0

+1,但只是一個小挑逗。類的實例並不是每個*都有一個'static'變量的副本。它們屬於類本身,而不屬於由它創建的任何對象。 – asteri

+0

我只是讓我的'一'和'兩'變量靜態,它解決了我的問題。我從來沒有真正理解什麼是靜態,但現在它是有道理的。 – JDerksen

+3

使用靜力學時要特別小心,特別是如果您不理解它們。這聽起來像在這種情況下使用靜態只會掩蓋問題,而不是解決問題。 –

1

對於默認的構造函數,有一個或兩個是不爲空,你需要一些默認的非空值設置蘋果實例:

class Apple { 
    public Apple() 
    { 
     this("1", "2"); 
    } 
    public Apple(String one, String two) 
    { 
     this.one = one; 
     this.two = two; 
    } 
    //... 
} 
0

因此,在Pie所屬的Apple類是與您在Main中創建的不同的Apple。所以當你打電話給空的構造函數時,onetwo沒有設置在你的餡餅Apple中,而它們在主要的Apple中。如果你真的想讓它們保持一致,請參考Pie的main Apple,或者使Apple靜態。