正如@MadProgrammer 已经说过的那样:您不能创建将子类作为字段并对其进行初始化的类的新对象。StackOverflowError
由于您引入的循环依赖关系,这将创建一个。
考虑以下示例:
public class A {
C c;
B b = new B(c);
public A(C c) {
System.out.println("A constructor");
}
}
public class B extends A {
public B(C c) {
super(c);
}
}
public class C {
}
public class Test {
public static void main(String[] args) {
new A(new C());
// new B(new C());
}
}
newA
和 new的创建都B
将返回 aStackOverflowError
因为它们都将构造A
创建 class 实例的类B
,该实例创建 class 的实例A
等。
编辑以使用您的示例:
public class USBtoUSART extends DesktopApplication1View implements SerialPortEventListener{
public USBtoUSART(SingleFrameApplication app){
super(app);
}
}
public class DesktopApplication1View extends FrameView {
SingleFrameApplication ap;
public DesktopApplication1View(SingleFrameApplication app) {
super(app);
}
}
public static void Main(string[] args){
USBtoUSART serial = new USBtoUSART(new SingleFrameApplication());
}
这将发生:
- 定义
serial
为对象USBtoUSART
- 实例化一个新
USBtoUSART
对象。这将执行以下操作:
- 输入构造函数
USBtoUSART
- 输入其超类的构造函数,
DesktopApplication1View
- 输入其超类的构造函数,
FrameView
同时,参数SingleFrameApplication
将传递给每个构造函数。
听起来好像您的一般架构设置是错误的。你也许想延长SingleFrameApplication
?如果要USBtoUSART
实例化,则必须在构造函数中使用参数。
或者,执行以下操作:
public class USBtoUSART extends DesktopApplication1View implements SerialPortEventListener{
public USBtoUSART(){
super(new SingleFrameApplication());
}
}
public static void Main(string[] args){
USBtoUSART serial = new USBtoUSART();
}
但我不知道这是否适用于你的情况。