2013-04-18 79 views
3
class DogOwner { 
    Dog dog; 

    DogOwner(Dog dog) { 
     this.dog = dog; 
    } 
} 

class Dog { 
    int age; 

    Dog(int age) { 
     this.age = age; 
    } 
} 

DogOwner peter = new DogOwner(new Dog(2)); 
Dog max = peter.dog; 
max.age = 3; 

System.out.println(peter.dog.age); // 3 

我怎樣才能從retreive petermax沒有max是由peter擁有的Dog的參考?換句話說,我希望能夠將max的年齡設置爲3,而不需要更改peterDog如何「反引用」 Java中的對象

+10

但是'max' *是*'peter'的'Dog'。你需要一個*新的*'狗'。 –

+1

我的頭在旋轉...有趣的扭曲... –

+0

你在找一個克隆嗎? – iamnotmaynard

回答

5

您可能已克隆peter.dog,或者基於它創建一個新的實例。

+0

打敗我呢! – Flynn

+0

好的,謝謝,我正在尋找這個功能。雖然我不知道這個名字。將盡快接受。 – Aquillo

1

看這句話:

Dog max = peter.dog; 

而是這一行的,你可以深拷貝peter.dog然後拷貝分配到max,你都做了,你可以隨意操縱它。

+1

如何?該男子需要知道如何... –

1

max已經參考peter.dog。你不能只叫彼得的狗「馬克斯」,把這個男人的狗帶走!如果你不希望他是彼得的狗,你會如果你想peter.dogmax獨立發展必須得到一個新的狗...

Dog max = new Dog(peter.dog.age); 
2

,他們必須是獨立的情況下,這意味着你複製peter.dog,而不是將其分配給最大值。

您可以創建一個拷貝構造函數:

Dog(Dog otherDog) { 
    this.age = otherDog.age; 
} 

然後

Dog max = new Dog(peter.dog); 
0
DogOwner peter = new DogOwner(new Dog("Max", 2)); //This creates two new objects 
Dog max = peter.dog;//This sets a reference to one of those objects, somewhat indirectly 

因爲你有你的堆只有一個Dog對象,你不可能有狗指向peter參考文獻與參考文獻max指出的參考文獻不同。您必須創建一個新的Dog克隆peter的狗或創建一個新的批發。

+0

這個答案很混亂。 –

+0

如果您對我感到困惑,我會嘗試澄清。 –

3

對狗實施clone方法:

class Dog implements Cloneable 
{ 
    public Dog clone() 
    { 
     try{ 
      return (Dog)super.clone(); 
     } catch (CloneNotSupportedException ex) 
     { 
      // should not happen 
      return null; 
     } 
    } 

} 

然後使用可以是這樣的:

Dog max = peter.dog.clone(); 
max.age = 3; 
+0

既然NilsH擊敗你,我會接受他的回答。既然你花時間來做一個例子,我會贊成:) – Aquillo

+2

請注意,使用這種技術,你基本上使用'Object.clone()',它將創建一個對象的副本,其所有原始值都相同,以及指向相同外部對象的所有引用。因此,如果'Dog'包含對可變對象的引用,則此克隆技術將不足。外部對象也需要被克隆,並且克隆的「Dog」中的引用更新爲副本。 –

+0

@貝利斯:你說得對。感謝您記下它。雖然在我的情況下,這正是我需要的。 – Aquillo