2012-05-01 4 views
10

나는 AP Java 학생이며 시험을 위해 연습하고 있습니다. 이 질문 건너 와서 내가 대답을 이해하지 않습니다다형성 및 생성자

는 다음과 같은 클래스를 고려를 :

A obj = new B(); 

올바른을 다음 코드가 실행되는 출력은 무엇

public class A 
{ 
    public A() { methodOne(); } 

    public void methodOne() { System.out.print("A"); } 
} 

public class B extends A 
{ 
    public B() { System.out.print("*"); } 

    public void methodOne() { System.out.print("B"); } 
} 

대답은 B *입니다. 누군가가 메서드 호출의 순서를 설명해 주시겠습니까?

+0

'A'의 생성자에 print 문을 추가하면 더 명확해질 수 있습니다. –

답변

27

B 생성자가 호출됩니다. B 생성자의 첫 번째 암시 적 명령은 super() (수퍼 클래스의 기본 생성자를 호출합니다.)입니다. 그래서 A의 생성자가 호출됩니다. A의 생성자가 super()을 호출하면 아무것도 인쇄하지 않는 java.lang.Object 생성자를 호출합니다. 그런 다음 methodOne()이 호출됩니다. 오브젝트의 유형이 B이기 때문에 methodOne의 B 버전이 호출되고 B이 인쇄됩니다. 그런 다음 B 생성자가 계속 실행되고 *이 인쇄됩니다.

A의 생성자와 마찬가지로 생성자에서 재정의 할 수있는 메서드를 호출하는 것은 매우 나쁜 습관입니다. 즉, 아직 생성되지 않은 개체의 메서드를 호출합니다.

+4

+1, 특히 나쁜 습관 비트의 경우. –

+0

그리고 "클래스 A"가 예상 한대로 overidden 메서드가 작동하지 않을 수 있습니다. –

+0

나는 super()에 대한 암묵적인 호출에 대해 몰랐다. 고마워! – user1104775

2

기본 클래스는 파생 클래스보다 먼저 생성해야합니다.

B을 인쇄하는 methodOne()을 호출하는 첫 번째 A()이 호출됩니다.

다음으로 B()이 호출되어 *이 인쇄됩니다.