2014-03-21 1 views
1

я вижу пример из книги, которую я прочитал о Java:Почему я должен называть super() в Java?

public class A{ 
    public A(){ 
     System.out.println("A"); 
    } 
} 

public class B extends A{ 
    public B(){ 
     super(); 
     System.out.println("B"); 
    } 

    public static void main(String[] args){ 
     B b = new B(); 
    } 
} 

Я не могу понять, почему должен super() быть здесь? Даже если я удалю super(), я бы получил тот же результат (A будет напечатан, а затем B). Насколько я понимаю, когда я инициализирую подкласс, родительский класс инициализируется перед ним. Так зачем использовать super()?

ответ

12

В данном конкретном случае вам не нужно звонить super();, потому что Java будет вставлять вызов в super(); неявно в конструктор, если вы его явно не вызываете. (Java Tutorial link).

Это только становится необходимым в других случаях, в которых вы хотите звонить другому, не по умолчанию, конструктор суперкласса, например, это:

public class A{ 
    public A(String s){ 
     System.out.println("A"); 
    } 
} 

public class B extends A{ 
    public B(String s){ 
     super(s); 
     System.out.println("B"); 
    } 
} 
+0

Есть, однако, те, кто сказал бы, что это хорошая практика всегда четко указывать ваш суперкласс класса (я никогда не делаю сам) – Sam

2

super(); является излишним и ненужным. Однако иногда вы хотите или должны вызвать конкретный конструктор суперкласса. В таких ситуациях вам нужно будет использовать его с соответствующими параметрами: super(params);

0

Супер автоматически вызывается java. Если вы не перегрузите конструкторы. Я думаю, что это может быть неверно.

1

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

1

Первое, что происходит в любом конструкторе, - это вызов этого() или super(); Нет никакого вреда, вставляя пустые супер(), но если вы не создадите его, компилятор.
Явный вызов необходим только тогда, когда конструктор суперкласса принимает параметры.

class Parent{ 
Parent(String s1){ 

} 
} 

class Child extends Parent{ 
Child(String s1,String s2){ 
super(s1); 
this.s2=s2; 
} 
}