假设我有一个班级A
和一个班级B
。
public class A {
private B b;
public A() {
this.b = new B();
}
public B getB() {
return this.b;
}
}
public class B {
public String getSome() {
return "Get some!";
}
}
我知道我可以通过A获得B,因为A 有(或拥有)B:new A().getB()
。
但如果我有B,我可以得到A吗?
答案 0 :(得分:4)
当然,只需在B类中添加例程getA()
,然后将构造函数中的行更改为
public A() {
this.b = new B(this);
}
这当然假设您的B类有一个接受A
的构造函数,例如
public B(A a) {
this.a = a;
}
答案 1 :(得分:2)
B
需要明确引用其所有者:
public class B {
private final A owner;
public B(A owner) {
this.owner = owner;
}
public A getOwner() {
return owner;
}
}
在A
:
public A() {
b = new B(this);
}
答案 2 :(得分:2)
不。在Java中没有“所有者”这样的东西。任何对象都可以由任意数量的其他对象引用。
答案 3 :(得分:1)
如果你需要B总是绑定到A的实例,那么使B成为A:
的内部类class A {
B b = new B();
class B {
String getSome() {
// this will refer to the enclosing A
return A.this.toString();
}
}
}
内部(非静态)类始终具有对封闭实例的隐式引用,没有它就不能存在。为了从外部实例化B,您需要一个讨厌的语法:B b = new A().new B();
答案 4 :(得分:0)
不,那是不可能的。您正在寻找反向引用,但如果需要,我们必须在代码中创建它们。
如果要收集B的所有引用,可以使用构造函数或创建B的工厂(模式)来执行此操作。我将展示工厂:
public class B {
private static Set<? extends Object> referencers = new HashSet<? extends Object>();
private B(){} // no public constructor
public static create(Object parent) {
// cooperative approach, the caller should pass "this"
referencers.add(parent);
}
public static remove(Object parent) {
referencers.remove(parent);
}
}
答案 5 :(得分:0)
不,你不能。 B没有提到A。
答案 6 :(得分:0)
没有
类a引用了类B,但类B没有引用类A.引用只是一种方式。
答案 7 :(得分:0)
你也可以使用内部类
包裹测试;
公共类A {
B b = null;
public B getB()
{
return b;
}
public class B {
public A getA()
{
return A.this;
}
}
public static void main(String[] args) {
B b = new A().new B();
}
}