2016-08-24 58 views
-2

在類的實例方法中是否有任何方式來更改當前實例指向的內容?將當前實例設置爲同一對象的不同實例

這是我試過到目前爲止:

public class Test { 

    String name; 
    Test other; 

    public Test(String name) { 
     this.name = name; 
    } 

    public void setOther(Test test) { 
     this.other = test; 
    } 

    public void printName(){ 
     System.out.println(this.name); 
    } 

    public void testMeOut(){ 
     changeInstance(this, other); 
     printName(); 
    } 

    public static void changeInstance(Test instance1, Test instance2) { 
     instance1 = instance2; 
    } 
} 

和我用於測試的測試類類:

public class TestingTest { 
    public static void main(String[] args) { 
     Test test1 = new Test("Test1"); 
     test1.setOther(new Test("test2")); 
     test1.testMeOut(); 
     test1.printName(); 
    } 
} 

我預計輸出爲「測試2」,但麻煩printName()方法打印出「測試1」

由於被傳入的對象是通過引用不應該第一個實例成爲第二個實例嗎?有沒有什麼辦法可以做到這一點?

+1

爲什麼downvotes? – yitzih

+0

你認爲'this.other = test;'是做什麼的?你爲什麼這麼認爲?請也澄清你的想法_因爲傳入的對象是通過引用_手段。另外,你認爲實例成爲另一個實例是什麼意思。基本上,這很有意義,這就是爲什麼你收到降價。 –

+0

你並沒有真正改變實例。您只需將數據成員設置爲另一個實例即可。當你調用你的更改實例方法時,名稱不會改變 – Li357

回答

0

在Java中你無法做到這一點。一個實例就是它的實例,它有時稱爲身份。如果你能解釋你爲什麼要這樣做的原因,那麼肯定有其他方法可以獲得你之後的功能。例如,一個對象將其方法調用委託給其他對象當然是可能的和正常的。

裏面你changeInstance方法引用instance1instance2是本地唯一的那個方法,所以把一個新的參考到instance1有方法以外沒有影響。

一個例子:

public class Test { 

    String name; 
    /** delegate */ 
    Test other = null; 

    public Test(String name) { 
     this.name = name; 
    } 

    public void setOther(Test test) { 
     this.other = test; 
    } 

    public void printName(){ 
     if (other == null) { // no delegate, do my own work 
      System.out.println(this.name); 
     } else { 
      // delegate to other 
      other.printName(); 
     } 
    } 

} 

現在,如果你改變你的主要方法:

public static void main(String[] args) { 
    Test test1 = new Test("Test1"); 
    test1.printName(); 
    test1.setOther(new Test("test2")); 
    test1.printName(); 
} 

它將打印:

Test1 
test2 
相關問題