2017-06-03 68 views
0

我想desrcibe我的問題用一個例子:Java:始終具有相同內容的對象?

Base.java:

public class Base { 

    //NO annotations 
    public AnyClass anyObj; 

    public Base(){} 
} 

DerivedOne的.java:

public class DerivedOne extends Base{ 

    @SomeAnnotionsOne 
    public AnyClass anyObjWithAnnotations; 

    public DerivedOne (AnyClass anyObj){ 
     this.anyObj = anyObj; 
     anyObjWithAnnotations = this.anyObj; 
    } 
} 

DerivedTwo.java:

public class DerivedTwo extends Base { 

    //These annoations differ from @SomeAnnotionsOne 
    @SomeAnnotionsTwo 
    public AnyClass anyObjWithAnnotations; 

    public Derived_Two(AnyClass anyObj){ 
     this.anyObj = anyObj; 
     anyObjWithAnnotations = this.anyObj; 
    } 
} 

所以我只是想anyObjWithAnnotations總是等於anyObj

實施例主要:

public static void main(String[] args){ 
    DerivedOne derivedObj = new DerivedOne(new AnyClass()); 
    derivedObj.anyObj = null; 

    if(derivedObj.anyObjWithAnnotations == null){ 
     System.out.println("anyObjWithAnnotations : is null"); 
    } 
} 

沒有被打印。 anyObjnull,anyObjWithAnnotations不是。

我的問題:

難道anyObj總是一樣anyObjWithAnnotations

所以,即使我把其中一個null或創建AnyClass新實例new其他變量應該具有相同的新內容。

編輯:

更改整個例子來闡明該問題。

+0

'myObj1 = myObj2' ??爲什麼你想要兩個完全相同的值的兩個不同的對象? – luk2302

+0

您可以對這兩個對象使用相同的參考。 –

+0

@ luk2302這對我不起作用..'myObj2:is null'永遠不會被打印出來..這是一個非常特殊的情況下使用XML註釋:myObj1是在基類中定義的,我需要它在派生類中 – Truntle

回答

2

您可以使用下面的代碼,其中我只創建對象1時間,然後將其引用分配給第二個對象。通過這種方式,如果一個對象中的值發生了更改,則在示例t1中,它也會反映到t2中。

class Test { 
    private int val; 

    public Test(int val) { 
     this.val = val; 
    } 

    public int getVal() { 
     return val; 
    } 

    public void setVal(int val) { 
     this.val = val; 
    } 
} 
public class TestSame { 
    public static void main(String[] args) { 
     Test t1 = new Test(10); 
     Test t2=t1; 
     System.out.println(t1.getVal()); 
     System.out.println(t2.getVal()); 

     t1.setVal(20); 

     System.out.println(t1.getVal()); 
     System.out.println(t2.getVal()); 

    } 
} 

O/P: -

10 
10 
20 
20 

您還可以檢查T1和T2具有相同的哈希碼值

System.out.println("t1 hashcode "+ t1.hashCode()); 
    System.out.println("t2 hashcode "+ t2.hashCode()); 
+0

這工作很好unitl你設置'myObj1'爲'null' ..'myObj2'在這一點上不會改變..''myObj2:is null'永遠不會被打印 – Truntle

+0

是的,當你這樣做時,你不應該改變該引用,你應該總是使用getter和setter來修改對象的狀態。 –

+0

我改變了我的例子。你能告訴我這是否可能嗎?如果是的話,我該如何實現它?謝謝 – Truntle

0

看起來像你需要一個單例。

public class Singleton { 
    private int val = 0; 

    public void setVal(int val) { 
     this.val = val; 
    } 
    public static final Singleton INSTANCE = new Singleton(); 

    private Singleton() { } 

    public static Singleton getInstance() { 
     return INSTANCE; 
    } 
} 

用例:

Singleton s1 = Singleton.getInstance(); 
Singleton s2 = Singleton.getInstance(); 

s1.setVal(42); 

如果單是太多的情況下,你可以使用的方法:

Object obj1 = new Object(); 
final Object obj2 = obj1; 

因爲obj2爲最終參考 - 你將不能夠改變(重新分配)它。因此,obj2obj1將引用相同的對象實例。但有可能重新分配obj1參考。如果您設置了finalobj1obj2 - 您將得到您想要的。

final Object obj1 = new Object(); 
final Object obj2 = obj1; 
+0

單身模式不會幫助我的情況。對你的第二個建議:'myObj2:is null'永遠不會被打印。如果'myObj1'爲'null','myObj2'應該也是! – Truntle

+0

它將爲空。第一次分配後您不能更改引用。但如果你將分配:'最終對象obj1 = null' - 它將爲空 –

+0

似乎你不明白單身使用情況:如果你將setVal(null) - 它會改變'兩個'對象 –

相關問題