對象本質上不知道它們被實例化的地方,沒有。
也就是說,你可以添加一個對實例化對象的引用到子對象中。這對於電路板實現很有用,因此瓷磚或空間可以爲電路板對象提供相鄰參考等。
對於您的示例,如果所有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
),那麼這兩種方法都無效。在這種情況下,您可以做的最好的方法是創建類型爲Object
的B
的參數,並根據需要進行強制轉換以獲取字段,或者根據需要使實例化具有共享行爲的類共享一些接口。這裏有一個例子:
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());
}
}
你需要在'B'一個字段存儲的創造者,這將是一個構造函數,字'this'括號內,當你創建對象。 –
你可以使用嵌套類。如果你使B類嵌套到A類,那麼B類甚至可以訪問A類的私有字段。 – Everv0id