【问题标题】:How to write new instance of subclass如何编写子类的新实例
【发布时间】:2013-10-24 23:10:48
【问题描述】:

有人可以帮我正确扩展我在 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);顺序。

感谢您的帮助,它正在把我活生生吃掉......

【问题讨论】:

  • 请发布您收到的错误消息或异常堆栈跟踪。
  • USBtoUSART 不能从DesktopApplication1View 扩展并成为DesktopApplication1View 中的实例变量
  • “我认为是因为 USBtoUSART 串​​行 = 新 USBtoUSART(ap); 序列。”删除这条线,你就确定了。
  • 父母如何使用孩子的功能 - 你有鸡和蛋的问题。在正确定义父级之前,无法定义子级,因此您最终会遇到无法真正定义父级和子级的情况,因为它们现在相互依赖
  • @MadProgrammer,对不起 - 我有一个与继承有关的脑屁。我几乎一发表评论就意识到了这个问题。

标签: java swing constructor subclass superclass


【解决方案1】:

正如@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,该类创建一个类B 的实例,该类创建一个类@987654328 的实例@等

编辑以使用您的示例:

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

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

【讨论】:

  • 好的,我明白了。那么我怎样才能从 USBtoUSART 访问 DesktopApplication1View 方法呢?抱歉,我是 Java 新手。
  • @comeback:只要方法声明为publicprotected,您就可以像使用同一个类一样使用它们。只需新建一个USBtoUSART的对象,去掉循环依赖(USBtoUSART serial = new USBtoUSART(ap);)就可以使用方法了。
  • 好的,但我无法创建新对象,因为我必须使用 USBtoUSART serial = new USBtoUSART();。但是USBtoUSART的构造函数有一个参数,不知道怎么用,因为又是SingleFrameApplication。
  • @comeback:你导入SingleFrameApplication了吗?你确定它有一个无参数的构造函数吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多