2015-04-03 27 views
0

我試圖添加形狀對象的當前位置到我的ArrayList,但是當對象位置改變我的列表對象改變太..JavaSE在列表中添加對象但爲了更改對象爲什麼?

多小時後,搜索後,我發現了一個不同的方式和現在的位置留相同甚至向對象位置改變

這裏引起的ArrayList改變我的第一個代碼:

MyPoint p11 = (MyPoint) getCorners()[0]; 
    MyPoint p22 = (MyPoint) getCorners()[1]; 
    MyPoint p33 = (MyPoint) getCorners()[2]; 
    MyPoint p44 = (MyPoint) getCorners()[3]; 

這裏是第二個代碼永遠不變的目標位置

MyPoint p11 = new MyPoint(getCorners()[0].getX(), getCorners()[0].getY()); 
    MyPoint p22 = new MyPoint(getCorners()[1].getX(), getCorners()[1].getY()); 
    MyPoint p33 = new MyPoint(getCorners()[2].getX(), getCorners()[2].getY()); 
    MyPoint p44 = new MyPoint(getCorners()[3].getX(), getCorners()[3].getY()); 

當我使用下面的代碼,我是監控輸出,並與他們改變了第一個代碼,與第二,他們不

 System.out.println(nl.get(0).getCorners()[0].getX()); 
     System.out.println(nl.get(0).getCorners()[1].getX()); 
     System.out.println(nl.get(0).getCorners()[2].getX()); 
     System.out.println(nl.get(0).getCorners()[3].getX()); 

我的問題是,我想了解和學習之間的兩個 代碼的差異。

可否請你給我解釋的傢伙..提前

謝謝...

+0

在一個你創建一個新的對象,並改變它(一個與'新'在裏面)。在另一個引用列表中的對象。 – 2015-04-03 16:48:51

回答

1

當你在做MyPoint p11 = (MyPoint) getCorners()[0];你還是指現有的沒有創造新的,這意味着在現有對象的任何修改都會反映在P11

MyPoint p11 = new MyPoint(getCorners()[0].getX(), getCorners()[0].getY());要創建新的對象。因此,在現有的對象中的任何修改不會在P11

+0

非常感謝我瞭解基本 – abakisensoy 2015-04-03 17:18:32

0

的問題是,在你把列表中的第一個變種對象,你以後的變化,在第二個你,你創建這些對象的副本反映,原來的對象,所以當改變,副本保持不變。

我建議你重構類MyPoint所以這將是不可改變的。這意味着值xy將是final,並且將不會有方法setX,setY(您將初始化構造函數中的值xy)。

然後當您移動形狀而不是更改xy的值時,您將交換整個點。

這將允許你在多個形狀重複使用相同的點,你將能夠把點到列表等,而不必擔心他們被後來被一些無關的代碼改變。

0

嗯,我覺得這事與你,因爲你已經寫了第一你到數組列表中的對象的引用而將其賦值給一個新的對象說P11上的代碼,但是這個新對象仍然指向現有的(它是已經在arraylist中的引用),所以無論你在p11上做出什麼樣的改變,它們都會反映在列表中的對象中,因爲基本上它們是相同的。在第二種情況下,您正在使用數組列表中的對象的值(通過在構造函數中傳遞它們)創建該類的新實例。你定義的對象是一個新實例,它與列表中的對象完全不同,所以無論你做什麼更改,列表中相應的對象都不會改變。

相關問題