2016-08-24 6 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(); 
    } 
} 

私は出力が「TEST2」であることが予想けれどものprintName()メソッドをわざわざ"Test1"を印刷する

渡されるオブジェクトは参照であるため、最初のインスタンスが2番目のインスタンスにならないはずです。これが可能な方法はありますか?

+1

なぜdownvotes? – yitzih

+0

'this.other = test;はどう思いますか?どうしてそう思うの?あなたが考えるものを明確にしてください_渡されているオブジェクトがreference_であるためです。また、インスタンスが別のインスタンスになるとはどういう意味ですか?基本的に、これはほとんど意味がないので、あなたがダウンボントを受信して​​いる理由です。 –

+0

あなたは実際にインスタンスを変更していません。データメンバを別のインスタンスに設定するだけです。あなたの変更インスタンスメソッドを呼び出すと、名前は変更されません – Li357

答えて

0

Javaでこれを行う方法はありません。インスタンスはそれが存在するインスタンスです。それはときどきIDと呼ばれます。あなたがこれを望む理由を説明できるなら、間違いなくあなたが行っている機能を得る他の方法があります。例えば、オブジェクトがそのメソッド呼び出しを他のオブジェクトに委譲することは確かに可能であり、正常です。あなたのchangeInstanceメソッド内

参照instance1instance2はとてもメソッド外では効果がありませんinstance1に新しい参照を入れ、唯一そのメソッドに対してローカルです。

例:

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

それが印刷されます:あなたがあなたの主な方法を変更した場合、今

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(); 
     } 
    } 

} 

Test1 
test2 
関連する問題