2014-05-13 5 views
4

아래에이 출력이 있습니다. Java - 재정의 된 메소드가 두 번 호출되는 이유는 무엇입니까?

Hello World! 
main.ConstructedDerivedClass:6.0 
main.ConstructedDerivedClass:6.0 
public class ConstructedDerivedClass extends ConstructedBase { 

    private static final double version = 6.0; 

    public static void main(String[] args) { 

     System.out.println("Hello World!"); 

     ConstructedDerivedClass derivedClass = new ConstructedDerivedClass(); 
    } 

    public ConstructedDerivedClass() { 
     showMyAttributes(); 
    } 

    @Override 
    protected void showMyAttributes() { 
     System.out.println(this.getClass().getName() + ":" + version); 
    } 
} 

public class ConstructedBase { 

    private static final double version = 15.0; 

    public ConstructedBase() { 
     showMyAttributes(); 
    } 

    protected void showMyAttributes() { 
     System.out.println(this.getClass().getName() + ":" + version); 
    } 
} 

나는 그것이 하나 개의 라인을 표시하는 기대

, 자식 클래스의 (ConstructedDerivedClass). 하지만 대신 인쇄물이 두 번 나옵니다. 일반적으로 생성자에서 오버라이드 된 메서드를 호출하지 말아야한다는 것을 알고 있지만, 어떻게 작동했는지 직접보고 싶었습니다.

사실, 버전이 '6.0'인 이유는 두 행 모두입니다. 물론 필드가 정적으로 선언 되었기 때문에 정적 필드가 먼저 초기화됩니다. 그러나 아직도 두 라인을 얻지 못합니다.

모든 안내를 받으실 수 있습니다.

+0

이 중복 될 수에 해당 그래서 컴파일러는 실제로 바이트 코드의 슈퍼 기본 생성자에 전화를 겁니다 때문에 –

+0

감사. 이것에 아직도 새롭다. 아래의 두 가지 대답 모두 도움이됩니다. 하나를 선택하기가 어려웠습니다. –

답변

5

이다 (그러나 나는 didn를 비록 검색의 순간 이후에 하나를 찾는다.) 그렇다고하더라도, 이것은 당신이 관심을 가지고있는 결과물과 그것을 재현하는 전체 코드를 명확하게 보여주는 잘 쓰여진 질문이다. 잘 했어!
5

개체가 인스턴스화 될 때 implicit, no-args 상위 생성자가 자신의 생성자를 실행하기 전에 상위 생성자를 호출합니다.

public MyClass() { 
    super(); //If this line is not here, it is implicit. 
    //rest of the code 
} 

당신은 당신의 자신의 explicit, any-args 슈퍼 생성자 호출을 제공하여이를 대체 할 수 있지만,이 방법의 첫 번째 줄 수 있어야합니다

이 라인은 당신의 생성자에 항상 있다는 것을 상상할 수있다.

public MyClass() { 
    super(1, "Hello Word", null); //written explicitly, no other super-constructor code will run 
    //rest of the code 
} 

슈퍼 클래스에 인수없는 생성자가 정의되어 있지 않은 경우 유용 할 수 있습니다. '당신이

public ConstructedDerivedClass() { 
    showMyAttributes(); 
} 

를 작성할 때

public ConstructedDerivedClass() { 
    super();   
    showMyAttributes(); 
} 
+0

알았습니다. 'showAttributes()'가 두 번 호출되는 것을 명확하게 볼 수 있었기 때문에 다른 하나만 선택했습니다. 그러나 이것은 또한 도움이되었습니다. –

관련 문제