2013-10-09 87 views
1

我目前正在編寫一個java程序,我得到的結果似乎很奇怪。我構建類SimulatedExchange,它具有以下構造的對象:爲什麼我新建的物體看起來是相同的?

public class SimulatedExchange { 
public static String exchangeName; 
SimulatorData sim; 

public static double Fee; 
public static Limit buyLimit; 
public static Limit sellLimit; 

public SimulatedExchange(String exchangename, SimulatorData simdata){ 
    exchangeName = exchangename; 
    sim = simdata; 
    if (exchangename.contentEquals("Exchange1")) Fee = .005; 
    if (exchangename.contentEquals("Exchange2")) Fee = .0055; 
    if (exchangename.contentEquals("Exchange3")) Fee = .002; 
    buyLimit = new Limit(); 
    sellLimit=new Limit(); 

} 

我的主類看起來是這樣的:

 public static void main (String[] args){ 
      SimulatorData fake = new SimulatorData("c:/users/el nico/documents/SimulatorData.xls"); 
    SimulatedExchange Exchange1 = new SimulatedExchange("Exchange1", fake); 
     SimulatedExchange Exchange2 = new SimulatedExchange("Exchange2", fake); 
    SimulatedExchange Exchange3 = new SimulatedExchange("Exchange3", fake); 

     System.out.println("1st exchange name: " + Exchange1.exchangeName); 
     System.out.println("2nd exchange name: " + Exchange2.exchangeName); 
     System.out.println("3rd exchange name: " + Exchange3.exchangeName); 

    } 

凡SimulatorData對象包含數據的ArrayList它從文件讀取施工時。

我得到以下輸出:

1日交換名稱:Exchange3

第二交換名稱:Exchange3

第三交換名稱:Exchange3

這奇怪的是我,因爲我在SimulatedExchange對象名稱Exchange1,Exchange2和Exchange3的三個不同構造函數中輸入了不同的字符串,所以我會認爲構造函數會將它們的每個exchangeName屬性設置爲di fferently。我對Java有點新鮮,我不確定爲什麼這可能不會發生。我不認爲我將不同Exchange的地址設置爲指向堆中的同一個對象,因爲我每次都在構造一個新對象。

我注意到的一件事是對象具有正確的exchangeName屬性(以及所有其他屬性),因此這意味着只有在構造相同類的另一個對象時纔會更改它。這表明Exchange1,Exchange2和Exchange3都指向堆中的同一個對象。但我不明白爲什麼會發生這種情況。

任何有識之士將不勝感激!如果答案非常明顯,我很抱歉,這似乎是肯定的。我似乎無法找出問題所在。 謝謝,保羅

回答

3

exchangeName件爲static,這意味着只有對單個實例類,而不是每個實例

每次調用構造函數時,都會覆蓋它。 只需刪除靜態修改器,使其成爲一個實例變量,你應該沒問題。

編輯: 同樣適用於您的其他成員 - Fee,buyLimitsellLimit

+0

哇,我老實說永遠不會明白到目前爲止靜態意味着什麼。這完全清除了。謝謝你 – Paul

1

您的exchangeName變量是靜態的,因此它屬於類而不是SimulatedExchange實例。

如果你刪除靜態它應該工作;

public String exchangeName; 
5

您有exchangeName設置爲static。這意味着只有一個exchangeName的實例,無論您擁有多少個實例SimulatedExchange。使其非靜態。另外,將this添加到構造函數中的實例變量中,例如this.exchangeName = exchangename;

+0

+1。到目前爲止,唯一的答覆者注意到這兩個錯誤。 –

相關問題