2014-12-23 112 views
0

我不知道如何訪問實例化該對象的對象的類。Java訪問實例化的對象

舉例清晰:

public class A { 

    B b; 
    int number = 5; 

    public A() { 
     b = new B(); 
    } 
} 

public class B { 

    public B() { 
     System.out.println(/*code to get the value of number*/); 
    } 
} 

我不能只是通過numberB

這甚至可能在java中?

+0

你需要在'B'一個字段存儲的創造者,這將是一個構造函數,字'this'括號內,當你創建對象。 –

+0

你可以使用嵌套類。如果你使B類嵌套到A類,那麼B類甚至可以訪問A類的私有字段。 – Everv0id

回答

4

對象本質上不知道它們被實例化的地方,沒有。

也就是說,你可以添加一個對實例化對象的引用到子對象中。這對於電路板實現很有用,因此瓷磚或空間可以爲電路板對象提供相鄰參考等。

對於您的示例,如果所有B都由相應的A實例化,則可以將類修改爲例如:

public class A { 

    B b; 
    int number = 5; 

    public A() { 
     b = new B(this); 
    } 
} 

public class B { 

    public final A instant; 

    public B(A a) { 
     instant = a; 
     System.out.println(a.number); 
    } 
} 

另一種方式來實現相同的影響,如果所有B被一個一個A內構成是使一B非靜態內部類。這將使每個B訪問其相應的A的號碼字段。

public class A { 
    B b; 
    int number = 5; 

    public A() { 
     b = new B(this); 
    } 

    class B { 
     public B() { 
      System.out.println(number); //Has access because it must be constructed within an A instance 
     } 
    } 
} 

這顯然是更清潔,但使B一個內部類,還有其他的設計影響,可能會或可能不適合您的項目。

但是,如果您不知道實例化對象的類(如果它不總是A),那麼這兩種方法都無效。在這種情況下,您可以做的最好的方法是創建類型爲ObjectB的參數,並根據需要進行強制轉換以獲取字段,或者根據需要使實例化具有共享行爲的類共享一些接口。這裏有一個例子:

public interface Instantiator{ 
    public int getNumber(); 
} 

public class A1 implements Instantiator{ 
    private B b; 
    public A() { 
     b = new B(this); 
    } 

    public int getNumber(){ 
     return 5; 
    } 
} 

public class C implements Instantiator{ 
    private B b; 
    private int count = 0; 

    public C(){ 
     count++; 
     b = new B(this); 
    } 

    public int getNumber(){ 
     return count; 
    } 
} 

public class B { 

    public final Instantiator instant; 

    public B(Instantiator a) { 
     instant = a; 
     System.out.println(a.getNumber()); 
    } 
} 
+0

我注意到'B'中保存的變量不會隨'A'中保存的變量一起更新,是任何更好的/正確的方法來解決此問題,而不是一個'Update()'方法?就像哈雷斯的回答。此外,謝謝你的偉大答案。 –

+0

儘管可以添加該行爲,但我不認爲它實際上會做任何事情。每當你「更新」一個'A'對象的''b''字段時,你就構造了一個* new *'B'對象,當然這個對象會有一個最新的'a'字段。 – Mshnik

+0

我在想一個遊戲循環,但無論如何它是微不足道的。 –

0

像Java面嚮對象語言首先你需要提供封裝,基本上是把所有的atributes私人然後用設置傳遞的值,例如,也如果你想訪問你可以從一個usend關鍵字中刪除數字extend你也可以把類的屬性號放在B類中,然後你可以做一些類似於a.getB()。setNumber()或getNumber()取決於你想要的getter是爲了讀值和setter是爲設定值:

public class A { 

    B b; 
    private int number; 

     public A() { 
       b = new B(); 
     } 

     public void setNumber(int number){ 
    this.number=number; 
     } 

     public int getNumber(){ 
      return number; 
     } 
} 

然後在類B

public class B extends A { 

    public class B(){ 
     setNumber(100); 
    } 

} 
+0

我知道延伸,但這裏不適合。 –

0
public class A { 

    B b; 
    int number = 5; 

    public A() { 
     b = new B(); 
     b.setNum(number); 
    } 
} 

public class B { 
    int number; 
    public B() { 
     System.out.println(number); 
    } 
    public void setNum(int n) { 
     number = n; 
    } 
}