2013-10-08 3 views
0

Что случилось с следующим кодом и как его исправить? Моя цель - работать с суперклассом в моем методе main. Этот объект суперкласса должен сам создать (в своем внутреннем состоянии) экземпляры своего подкласса. Цель этого заключается в том, что для подкласса требуется только состояние суперкласса, и поскольку все операции, которые должен выполнять подкласс, важны только для суперкласса.Как создать подкласс из суперкласса

public class Test { 
    public static void main(String[] args) { 
     Test2 testSuperclass = new Test2("success #1"); 
    } 
} 

class Test2 { 
    public Test2(String printComment) { 
     System.out.println(printComment); 
     Test3 testSubclass = new Test3("success #2"); 
    } 
} 

class Test3 extends Test2 { 
    public Test3(String printComment2) { 
     System.out.println(printComment2); 
    } 
} 

Test3 Конструктор генерирует ошибку Implicit super constructor Test2() is undefined. Must explicitly invoke another constructor.

ответ

3

Первое, что должен сделать конструктор, это вызвать конструктор для суперкласса.

Часто вы этого не видите, потому что компилятор Java автоматически вставляет вызов конструктору без аргументов (super()), если вы не указали другой. Но в вашем случае нет конструктора без аргументов в Test2 (потому что вы создали еще один, который нуждается в String).

public Test3(String printComment2) { 
    super(printComment2); 
    System.out.println(printComment2); 
} 
+0

Так что, если бы я должен был вставить соответствующий конструктор, чтобы вызов 'super()' мог быть вызван, этот вызов 'super()' в принципе ничего не даст и позволит мне получить функциональность, указанную в моем сообщении? – user2763361

+0

Если вы добавите конструктор no-arg в Test2, он будет автоматически вызван компилятором. Будь то что-то или нет, зависит от вас. – Thilo

0

Добавление ответа Тило, в когда вы явно не определить супер (вызов конструктора родителя) неявный вызов осуществляется как просто «супер()». Таким образом, вы по существу разрешаете вызов конструктору Test2, но не передаете строку, приводящую к неопределенной ошибке.

0

Вы можете выполнить одно из следующих действий:

  1. Если вы просто хотите, чтобы сделать ваш код работать без какой-либо дополнительной печати или создания объектов, не создают конструктор без аргументов:

    class Test2 { 
        public Test2(){ 
        } 
        public Test2(String printComment) { 
         System.out.println(printComment); 
         Test3 testSubclass = new Test3("success #2"); 
        } 
    } 
    
    class Test3 extends Test2 { 
        public Test3(String printComment2) { 
         System.out.println(printComment2); 
        } 
    } 
    
  2. Или другой путь был тио отметил:

    public Test3(String printComment2) { 
        super(printComment2); 
        System.out.println(printComment2); 
    } 
    
Смежные вопросы