0

有人可以帮我正确扩展我在 Java 中的方法 USBtoUSART 吗?我设法扩展它,但我有问题,创建子类的新实例。

public class USBtoUSART extends DesktopApplication1View implements SerialPortEventListener{
   public USBtoUSART(SingleFrameApplication app){
        super(app);    
   }
}


public class DesktopApplication1View extends FrameView {
    SingleFrameApplication ap;
    USBtoUSART serial = new USBtoUSART(ap);

    public DesktopApplication1View(SingleFrameApplication app) {      
        super(app);
    }
}

我希望 USBtoUSART 成为 DesktopApplication1View 的子类,但我收到应用程序将崩溃的错误消息。我认为是因为 USBtoUSART 串​​行 = new USBtoUSART(ap); 序列。

感谢您的帮助,它正在吞噬我的生命...

4

1 回答 1

0

正如@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());
}

这将发生:

  1. 定义serial为对象USBtoUSART
  2. 实例化一个新USBtoUSART对象。这将执行以下操作:
    1. 输入构造函数USBtoUSART
    2. 输入其超类的构造函数,DesktopApplication1View
    3. 输入其超类的构造函数,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();
}

但我不知道这是否适用于你的情况。

于 2013-10-24T23:22:14.397 回答