2016-01-26 2 views
-4

Эта программа Java выдает 12 и «Test». Но я не могу понять, почему 12 было напечатано.Странный выход в java 3

// Filename: MyClass.java 
public class MyClass { 
    public static void main(String[] args) { 
     B b = new B("Test"); 
    } 
} 
class A { 
    A() { this("1", "2"); } 
    A(String s, String t) { this(s + t); } 
    A(String s) { System.out.println(s); } 
} 
class B extends A { 
    B(String s) { System.out.println(s); } 
    B(String s, String t) { this(t + s + "3"); } 
    B() { super("4"); }; 
} 
+0

'B (String)' вызывает A() '' '' '' super() 'перед выполнением собственного кода. –

+6

Java 3 ?? Вау ... Во всяком случае; ** отформатируйте свой код **. –

+1

Конструктор по умолчанию суперкласса всегда вызывается, если не указан другой. – matt

ответ

4

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

Так

class B extends A { 
    B(String s) { System.out.println(s); } 
} 

становится

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

Это происходит всегда. В вашем случае вызывается конструктор A() { this("1", "2"); }, который теперь вызывает A(String s, String t) { this(s + t); } и, наконец, A(String s) { System.out.println(s); }.

Помня об этом, должно быть ясно, что A() { this("1", "2"); } несет ответственность за печать 12.

+0

, если вы добавите конструктор по умолчанию для B, новые B (ы) вызовут ужин() ?? – Billydan

+0

@Billydan да, добавив раструб конструктора по умолчанию, ничего не меняя при вызове 'new B (s)'. Даже конструктор по умолчанию будет вызывать 'super()' при вызове 'new B()' – exception1

+3

@Billydan Только, если был вызван 'dinner()'. – Gendarme

0

Эй, нет ничего плохого, есть неявный вызов суперконструктора. , так как класс B расширяет класс A всякий раз, когда вы создаете экземпляр класса B, он вызывает конструктор класса A также - в вашем случае его конструктор по умолчанию класса A, который снова вызывает ваш конструктор классов «A (String s, String t)», и это снова вызывает «A (String s)». поэтому он дает результат как 12 и Test. что правильно.

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