2016-11-11 100 views
-1

在我的主要方法中,我需要打印出在第二個類中創建的兩個對象。這是我的代碼。當我的對象包含數組時,我該如何重寫toString方法?

public String toString(){ 

     String z = ""; 
     for(int i = 0; i<data.length;i++){ 
      z = z + data[i] + ", "; 
     } 
     return z; 
    } 

我有一個Stat構造函數,它將數組數據設置爲調用對象中調用的數組。

public Stat(double[] d){ 
     double[] data = new double[d.length]; 
     this.data = data; 

這是我的初始化數據

int i=1; 
private double[] data = new double[i]; 

這是調用類

public static void main(String[] args){ 
double[] data = {1.0, 2.0, 3.0}; 
Stat statA = new Stat(data); 

data[0] = 3.0; 
data[1] = 4.0; 
data[3] = 5.0; 

Stat statB = new Stat(data); 
System.out.println("statA data= " + statA.toString()); 
System.out.println("statB data= " + statB.toString()); 

當我運行調試對象包含正確的數據值,但是當我調用toString,他們都打印{0.0,0.0,0.0}

+0

爲什麼你認爲問題是'toString'? –

+0

僅供參考:您可以將'toString()'縮短爲'返回String.join(「,」,data);'如果'data'是'List '(可以輕鬆製作成列表)。 – Gavin

回答

0

我相信你的

0可以在創建輸入數組大小( d.length)的一個新的數組

public Stat(double[] d){ double[] data = new double[d.length]; this.data = data;

引起該問題,因此,與類中的陣列不包含數據。你想要的東西,如:

public Stat(double[] d){ this.data = d }

0

您可以Arrays.toString(statA)嘗試,如果該實例成員的數據是錯誤的。

5

這裏是你的問題:

public Stat(double[] d){ 
     double[] data = new double[d.length]; 
     this.data = data; 

創建數據陣列是新d.length大小的數組。 在Java中,新分配的內存默認填充0,所以這就是爲什麼你已經打印了你的程序。

更改代碼,e.x:

public Stat(double[] d){ 
     this.data = d; 
+1

這大多是正確的。但是,'this.data'將是對'd'的引用,而不是單獨的數組,因此當在statA構造函數後改變內容時,statA.data將被改變。這顯然可以通過使用單獨的數組來構建'statA'和'statB'來避免,但最好使用'this.data = Arrays.copyOf(d,d.length);'以防萬一。 – jonhopkins

+0

@jonhopkins - 這是真的,但正如你在代碼中看到的,作者三次想要改變數組元素的值。 複製數組可以防止這種情況,這很明顯,因爲有各種引用。但是,作者想要什麼? –

+0

改變這兩個對象中的數據當然是可能的,這是OP希望和期望的。在這種情況下,代碼可以保持原樣(使用當然的更改)。但是我不能想到很多情況下,這就是我們想要的,所以我留下了我的第一個意見,作爲實際發生的事情的一個註釋,如果這不是OP想要的,那麼稍後可能會避免另一個問題, statA'和'statB'正在打印相同的東西。 – jonhopkins

相關問題