【问题标题】:Why two classes can refer each other in JAVA?为什么两个类可以在 JAVA 中相互引用?
【发布时间】:2016-06-26 06:27:03
【问题描述】:

我看到很多例子说明了 JAVA 中的一对一或多对多关系。但我仍然不明白为什么会这样。

如果我有:

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

类 B(){A a = new A();}

当我在main方法中新建A作为起点时,JAVA如何分配内存来处理这种情况?内存分配不是无穷无尽的吗? A 有 b,然后 b 有另一个 A 然后 go on forever

非常感谢

另一个问题:

我可以这样做吗?

类 A(){B b; public void setB(B bb){}}

类 B(){A a; public void setA(A aa){}}

非常感谢

【问题讨论】:

  • 您是否尝试分配A?我建议你这样做,我想你会找到答案的。
  • 如果是一对一的关系,A 有一个 B 有相同的 A,所以没有无限的内存分配。
  • @YassinHajaj 不,不是。
  • @ElliottFrisch 稍微解释一下也无妨。
  • 他们有 AB 的唯一实例(他们没有共享它们,所以这是一个无限递归关系)。

标签: java memory-management


【解决方案1】:

Java 无法处理这种情况1;如果我们更正代码并分配A2 的实例(并使这些类static 以便我们可以将其嵌入到简单的MCVE 中)我们会看到类似

static class A {
    B b = new B();
}

static class B {
    A a = new A();
}

public static void main(String[] args) {
    A a = new A();
}

执行时抛出

Exception in thread "main" java.lang.StackOverflowError

1编译时,它在运行时通过耗尽堆栈内存来处理它。

2如果我们尝试分配B,也会发生同样的事情。

【讨论】:

  • 非常感谢,我再添加一个案例。新案例有效吗?
【解决方案2】:

除非这些对象是静态的,否则程序会抛出

java.lang.StackOverflowError

可以通过将变量设置为静态来轻松管理它,无论调用多少次都会导致只有一个实例并且内存不会溢出

如果你想让这样的事情起作用,你可以这样做(但这不是一个好习惯)

public class B {
static A a=new A();
}
public class A {
static B b=new B();
}
public class c {
public static void main(String[] args) {
A a=new A();
System.out.println("Task completed"+a);
}
}

【讨论】:

  • 非常感谢,我再添加一个案例。新案例有效吗?
  • 它也不会工作,因为内存分配仍然是旧的情况,所以它永远不会完成为 main 中声明的任何对象分配内存的循环
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多