2015-12-19 2 views
1

В этой программе нет необходимости в super для достижения конструктора суперкласса:Нужно ли мне супер при создании подкласса или нет?

class Base{ 

    Base(){ 

     System.out.println("Base"); 
    } 
} 

public class test2 extends Base{ 

    test2() { 

     //super(); 
     System.out.print("test2"); 
    } 

    public static void main(String argv[]){ 

     test2 c = new test2(); 
    }  
} 

Но эта программа нуждается в super и выдает ошибку в quest1 конструктору говоря

конструктор quest не может быть применяется к данным типам: требуется int, не найдено аргументов

class Quest { 

    Quest(int y){ 

     System.out.print("A:"+y); 
    } 
} 

class Quest1 extends Quest { 

    Quest1(int x){ 

     //super(x+1); 
     System.out.print("B:"+x); 
    } 
} 

class Test { 

    public static void main(String argv[]){ 

     Quest1 q = new Quest1(5); 
    } 
} 
+0

На ваш вопрос ответили? – user1803551

+0

@ user1803551 Я понял, когда мне нужен супер, но ответы были сбивают с толку, когда речь заходит о необходимости супер. поэтому я не выбрал один. – madkobra

+0

Достаточно справедливо, но тогда вы должны попросить разъяснений у ответчиков, вот для чего нужны комментарии, и это их задача объяснить ответ и дополнить его. – user1803551

ответ

1

JLS 8.8.7. Конструктор Body

Если тело конструктора не начинается с явным вызовом конструктора и конструктора объявляемым не является частью изначального класса Object, то тело конструктора неявно начинается с вызовом конструктора суперкласса «super();», вызов конструктора его прямого суперкласса, который не принимает аргументов.

В

class Base { 

    Base() { 

    } 
} 

public class test2 extends Base { 

    test2() { 

     //super(); 
     System.out.print("test2"); 
    } 
} 

Закомментированный из строки добавляется автоматически, а с суперкласса конструктор без аргументов не определен, нет никакой ошибки.

В случае

class Quest { 

    Quest(int y) { 

     System.out.print("A:"+y); 
    } 
} 

class Quest1 extends Quest { 

    Quest1(int x) { 

     //super(x+1); 
     System.out.print("B:"+x); 
    } 
} 

неявного вызовом super() пытается вызвать неопределенный конструктор суперкласса, который вызывает ошибку

неявной супер конструктор Quest() не определенно.Необходимо явно вызвать другой конструктор.

Разоблачение вашего явного вызова конструктора заменяет неявный вызов и, следовательно, проблема разрешена. Альтернативно, определите конструктор без аргументов в суперклассе.

1

Вам нужно позвонить в super(), если и только если нет конструктора по умолчанию (принимающий без аргументов) для вашего родителя class.

Во всех остальных случаях (где существует конструктор с нулевыми аргументами) вам не нужно его кодировать. В любом случае, это неявно называется.

Настоящие Правила применяются:

  • если ваш родительский класс не имеет конструктора по всем, он имеет конструктор по умолчанию, который не принимает никаких аргументов -> нет необходимости в super();
  • You родительский класс объявляет конструктор без аргументов -> нет необходимости в super()
  • ваш класс имеет конструктор с аргументами, но не конструктор без аргументов -> вы необходимости позвонить одному из определены конструкторы с аргументами mathching через super()
-1

Если вы создаете конструктор в суперклассе, вы должны вызвать конструктор суперкласса (Ex: super()) до того, как конструктор подкласса получит вызов.

+0

Вы не можете вызвать супер-конструктор перед вызовом конструктора подкласса. Это должно быть первое, что вы делаете внутри конструктора подкласса. – user1803551

+0

Да, я тоже поддерживаю то же самое. Пис понял мой ответ. Что вы понимаете: super(); SubClass obj = new SubClass(); Все знают, что это Worng. Мой ответ: SubClass {super(); SubClass() {}} – Doss

+0

Почему вы не должны четко писать это в своем ответе? Как написано сейчас, это неправильно. – user1803551

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