如何编写子类的新实例

时间:2013-10-24 23:10:48

标签: java swing constructor subclass superclass

有人可以帮助我,请在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串口=新的USBtoUSART(ap);序列

感谢您的帮助,它让我活着......

1 个答案:

答案 0 :(得分: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());
    }
}

A和新B的创建都会返回StackOverflowError,因为它们都会构造类A,创建类{{1}的实例创建类B的实例,等等。

编辑以使用您的示例:

A

这将会发生:

  1. 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
  2. 的对象
  3. 实例化新的USBtoUSART对象。这将执行以下操作:
    1. 输入USBtoUSART
    2. 的构造函数
    3. 输入其超类USBtoUSART
    4. 的构造函数
    5. 输入其超类DesktopApplication1View
    6. 的构造函数
  4. 同时,参数FrameView将传递给每个构造函数。

    听起来好像您的一般架构设置有误。你想延长SingleFrameApplication吗?如果希望实例化SingleFrameApplication,则必须在构造函数中使用参数。

    或者,做这样的事情:

    USBtoUSART

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