2

假设我有一个 classA和一个 class 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吗?

4

8 回答 8

4

当然,只需getA()在 B 类中添加例程,并将构造函数中的行更改为

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

这当然假设您的 B 类有一个接受 的构造函数A,例如,

public B(A a) {
    this.a = a;
}
于 2011-02-16T21:56:52.837 回答
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);
}
于 2011-02-16T21:57:55.147 回答
2

没有。Java中没有“所有者”这样的东西。任何对象都可以被任意数量的其他对象引用。

于 2011-02-17T00:49:38.050 回答
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();

于 2011-02-16T22:02:20.150 回答
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);
   }
}
于 2011-02-16T21:58:09.077 回答
0

你不能。B 没有参考 A。

于 2011-02-16T21:58:16.607 回答
0

不。

A 类引用了 B 类,但 B 类没有引用 A 类。引用只是一种方式。

于 2011-02-16T21:58:26.623 回答
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();
}

}

于 2011-02-16T22:03:57.180 回答