2011-08-28 2 views
0

Super :: super()에서 Super :: printThree를 호출하는 방법?
아래 예제에서는 Test :: printThree를 대신 호출합니다.기본 생성자에서 Java 호출 기반 메서드

class Super { 
     Super() { 
     printThree(); // I want Super::printThree here! 
     } 
     void printThree() { System.out.println("three"); } 
} 
class Test extends Super { 
     int three = 3 
     public static void main(String[] args) { 
       Test t = new Test(); 
       t.printThree(); 
     } 
     void printThree() { System.out.println(three); } 
} 

output: 
0 //Test::printThree from Super::Super() 
3 //Test::printThree from t.printThree() 

답변

11

하위 클래스에서 재정의 된 메소드입니다. 비 가상 메서드 호출을 강제로 수행 할 수 없습니다. 메소드를 가상으로 호출하지 않으려면 메소드를 비공개 또는 최종으로 설정하십시오.

일반적으로 하위 클래스 생성자 본문은 아직 실행되지 않았으므로 생성자 내에서 비 ​​최종 메서드를 호출하는 것은 좋지 않습니다. 따라서 하위 클래스 생성자 본문은 아직 실행되지 않았으므로 효과적으로 완전히 초기화되지 않았습니다.

1

여기에 동적 발송 및 상속에 대한 전체 아이디어를 위반하는 것입니다. 그냥하지 마라. (어쨌든 자바에서 우회하는 것은 꽤 어렵다.) 이

1

상속 된 클래스에서 덮어 쓸 수 없습니다 수 있도록 Super 요구 printThree() 오버라이드 (override)되지 않도록 경우 대신 기능은 개인 및/또는 최종 확인하는 방법은 final로 선언 될 필요가있다. 이 클래스를 오버라이드 (override) 파생했다고하지 않을 권리를주고, 기본 클래스 final 같은 방법을 표시하지 않습니다

@Override 
void printThree() { super.printThree(); } 

경우 또는 Test의 최우선 방법은 선택하는 경우 오버라이드 (override) 메소드를 호출하도록 결정할 수 있습니다 그들이 원하는대로해라.

+0

그는 상속 된 클래스에서 super 메서드를 호출하고 싶지 않지만 다른 방법으로는 호출하지 않으려한다는 점을 제외하고는. 슈퍼 클래스의 슈퍼 클래스는 Object이므로, 슈퍼 클래스의 아이디어는 분명히 작동하지 않습니다. – Voo

+0

@Voo - 동의했습니다. 가능한 시나리오만을 지적했습니다. 그가 원하는 것은 불가능합니다. –

관련 문제