2013-10-24 4 views
0

Может ли кто-нибудь помочь мне, пожалуйста, правильно расширить мой метод USBtoUSART в Java? Мне удалось расширить его, но у меня есть проблема, чтобы создать новый экземпляр подкласса.Как написать новый экземпляр подкласса

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 = новый USBtoUSART (ap); последовательность.

Спасибо за любую помощь, она съедает меня в живых ...

+1

Просьба отправить сообщение об ошибке или трассировку стека исключений. –

+0

'USBtoUSART' не может расширяться из' DesktopApplication1View' и быть переменной экземпляра в 'DesktopApplication1View' – MadProgrammer

+1

« Я думаю, потому что последовательность USBtoUSART serial = new USBtoUSART (ap) ». Удалите линию, и вы будете уверены. –

ответ

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 и т.д.

Edit использовать пример:

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

Но я не знаю, если это применимо в вашей ситуации.

+0

ОК, я понял. Итак, как я могу получить доступ к методам DesktopApplication1View с USBtoUSART? Извините, я как бы новичок на Java. – comeback

+0

@comeback: пока методы объявлены 'public' или' protected', вы можете просто использовать их так, как если бы это был тот же класс. Просто создайте новый объект 'USBtoUSART', удалите циклическую зависимость (' USBtoUSART serial = new USBtoUSART (ap); '), и вы можете использовать методы. –

+0

ОК, но я не могу создать новый объект, потому что мне нужно использовать USBtoUSART serial = new USBtoUSART() ;. Но у конструктора USBtoUSART есть параметр, я не знаю, как его использовать, потому что это SingleFrameApplication снова. – comeback

Смежные вопросы