아래에이 출력이 있습니다. 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'인 이유는 두 행 모두입니다. 물론 필드가 정적으로 선언 되었기 때문에 정적 필드가 먼저 초기화됩니다. 그러나 아직도 두 라인을 얻지 못합니다.
모든 안내를 받으실 수 있습니다.
이 중복 될 수에 해당 그래서 컴파일러는 실제로 바이트 코드의 슈퍼 기본 생성자에 전화를 겁니다 때문에 –
감사. 이것에 아직도 새롭다. 아래의 두 가지 대답 모두 도움이됩니다. 하나를 선택하기가 어려웠습니다. –