2017-03-17 78 views
0
public class TriVal { 

private static int x; 
private static int y; 
private static int z; 

TriVal(int x, int y, int z) { 
    TriVal.x = x; 
    TriVal.y = y; 
    TriVal.z = z; 

    } 
public int sum(TriVal p2) { 
    int a = Math.abs(TriVal.x + p2.x); 
    int b = Math.abs(TriVal.y + p2.y); 
    int c = Math.abs(TriVal.z + p3.z); 
    int sum = a + b + c; 
    return sum; 
    } 
} 

這是包含一組3個值的對象的構造函數的一部分。 但是,我正在編寫一個函數,該函數通過將此對象的兩個實例的x,y和z相加來創建一個新的TriVal。將對象的新實例設置爲相同的值

所以說我們有

TriVal p1 = new TriVal(10, 10, 10); 
    TriVal p2 = new TriVal(20, 20, 20); 

調用函數

p1.sum(p2) 

(這是在其他地方類在內)應返回90 但是,它會返回120 我得知在創建TriVal對象的新實例時,先前定義的p1實例在某種程度上被設置爲與p2相同的值,這解釋了總和爲120.我相信這個錯誤位於某處ñ我的構造函數,也許以我更新值的方式或在類的頂部聲明變量? 任何有用的提示將不勝感激,謝謝!

+1

你知道靜態關鍵字的含義嗎?如果你不這樣做,我建議你查看它。您正在更改靜態值x,而不是實例變量x – Orin

+0

爲什麼將'x','y'和'z'聲明爲'static'?那是你的問題。 – JonK

+0

[可能是'static'關鍵字在類中做了什麼?](http://stackoverflow.com/questions/413898/what-does-the-static-keyword-do-in-a-class) –

回答

0
private static int x; 
private static int y; 
private static int z; 

你聲明你的實例成員是靜態的,它對於所有的實例都是一樣的。它們存儲最後分配的值。刪除靜態,你會沒事的。

正如@Orin指出的那樣,您需要稍微更改一下代碼,您應該將參數綁定到實例成員。

+0

用他當前的代碼,你還必須將'TriVal.x'的所有實例都替換爲'this.x'等。 – Orin

+0

對,我之前注意到這一點,並嘗試去除靜態,但是,然後我得到的錯誤,我不能在第一個構造函數中靜態引用非靜態字段,這使我相信我應該將變量保持爲靜態。 – rubyquartz

+0

@Orin這就解決了,謝謝! – rubyquartz

相關問題