java - 在两个不同的类中调用方法:调用彼此的方法
问题描述
我有 2 个不同的类,它们都相互调用方法。出于某种原因,当我在已经有一个从另一个类调用的对象的类中添加一个对象时,它给了我一个堆栈溢出错误。这是我正在处理的问题:
A类:
public class ClassA {
ClassB objA = new ClassB();
}
B类:
public class ClassB {
ClassA objB = new ClassA();
}
尝试运行时出现以下错误:
Exception in thread "main" java.lang.StackOverflowError
at package.ClassB.<init>(ClassB.java)
at package.ClassA.<init>(ClassA.java:26)
at package.ClassB.<init>(ClassB.java:17)
第 26 行和第 17 行是创建对象的位置(如我上面的示例)。我的错误示例的底部 2 行重复至少 50 次。
解决方案
创建 的实例时ClassA
,会创建 的实例ClassB
。
创建 的实例时ClassB
,会创建 的实例ClassA
。
因此,当创建这些类中的任何一个的实例时,您会启动一系列无限实例创建,从而导致StackOverflowError
.
如果您需要ClassA
保存对某个实例的引用,ClassB
反之亦然,我建议您不要在一个类内部创建另一个类的实例,而是在 setter 方法中传递对已创建实例的引用:
public class ClassA {
ClassB objA;
public setB (ClassB b) {
objA = b;
}
}
public class ClassB {
ClassA objB;
public setA (ClassA a) {
objB = a;
}
}
然后以这种方式创建实例:
ClassA a = new ClassA();
ClassB b = new ClassB();
a.setB(b);
b.setA(a);
推荐阅读
- c++ - 如何防止 clang-format 在流运算符调用之间添加换行符 <<
- couchdb - 每个文档的 CouchDB 3.0 8MB 限制是否包括文档的附件?
- javascript - 使用 Getusermedia 选择相机,然后使用 instascan
- azure - Azure IOT Edge 模块存储库名称必须为小写
- mysql - python to connect to mysql error out: 10060 A connection attempt failed, console connection to mysql is fine
- python - 合并多个没有公共列的数据框
- javascript - 将 JSON 响应正确下载为文件
- prolog - prolog查找列表的基数
- python-3.x - 部分打印输出
- mysql - 用于通知的 MySql 触发器