2015-05-12 87 views
-1

我不確定是否正確,但是我在我的類中創建了一個方法,在該方法中創建了一個用於保存數據的實例,這是因爲某些切換。然而,當我把它從什麼地方:在其方法中修改類的實例也會更改調用者變量

public static void otherClassMethod(MyClass myClass) { 
    MyClass m = myClass.doStuff(); // 1 
} 

public class MyClass { 

    private Item myItem; 
    private int mCount; 


    public void add(Item item) { 
     if (mCount == 0) { 
      myItem = item; 
      myItem.setNext(null); // 2 
      mCount++; 
     } else { 
      .... 
     } 
    } 

    public MyClass doStuff() { 
     if (mCount == 0) return null; 
     MyClass m = new MyClass(); 
     Item i = myItem; 
     do { 
      m.add(i); // 3 
      i = i.getNext(); // 4 
     } while (i != null); 
     return m; 
    } 
} 

在(4),它改變的變量(2)無論是從(3)和myClass的M(1),爲什麼(1)嗎? 我不知道我究竟得到了什麼,你能給我一個提示嗎? 謝謝。

+0

要修改的同一_reference_一個對象每種方法指向內存中的相同位置。當你將它分配給另一個變量時,你沒有得到一個新的對象。 –

回答

0

你所指的兩個變量都是相同的。因爲每次調用doStuff()方法時,都會創建MyClass的新實例並將其返回。 這是在(1)和(3)變更的情況。

如果您只想修改特定實例,請嘗試將其傳遞給doStuff()方法,而不是創建新實例。像這樣:

public void doStuff(MyClass s){ 
     //.. 
    } 

現在當你調用這個方法時,只有你傳遞給方法的實例會改變。 希望它有幫助。

0

謝謝@ @Ryan J,@hitz。我總是忘記它是一個正在通過的對象,所以引用它的值是相同的。

我改變了(3):

m.add(i); 

到:

m.add(new Item(i.getA(), ..)); 

如果有人在尋找答案:

Object a = new Object(); 
    Object b = a; // they are refering to the same reference, so they will change as one 

    Object c = new Object(a.getParam()); // set through a constructor parameter 
    Object d = new Object(); 
    d.setParam(a.getParam()); // set through setter and getter 
相關問題