2013-10-24 84 views
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 serial = new USBtoUSART(ap);序列。

感謝您的幫助,它吃了我還活着......

+1

請發佈您收到的錯誤消息或異常堆棧跟蹤。 –

+0

'USBtoUSART'無法從'DesktopApplication1View'擴展,併成爲'DesktopApplication1View'中的一個實例變量。 – MadProgrammer

+1

「我認爲是因爲USBtoUSART serial = new USBtoUSART(ap); sequence。」 刪除線,你會確定。 –

回答

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創建,創建類的實例B類的一個實例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. 定義serialUSBtoUSART
  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(); 
} 

但我不知道這是否適用於你的情況。

+0

好的,我明白了。那麼,我如何才能從USBtoUSART訪問DesktopApplication1View方法?對不起,我是Java的新手。 – comeback

+0

@comeback:只要方法被聲明爲「公共」或「受保護」,你可以像使用同一個類一樣使用它們。只需創建一個'USBtoUSART'的新對象,移除循環依賴('USBtoUSART serial = new USBtoUSART(ap);'),您就可以使用這些方法。 –

+0

行,但我不能創建一個新的對象,因爲我必須使用USBtoUSART serial = new USBtoUSART();.但USBtoUSART的構造函數有一個參數,我不知道如何使用它,因爲它是SingleFrameApplication。 – comeback

相關問題