2013-11-04 10 views
1

이 SCJP 6 책에서 코드입니다 :액세스 지정자는 하위 클래스에서 재정의를 포함합니까?

private final void flipper() { 
    System.out.println("Clidder"); 
    } 
} 

public class Clidlet extends Clidder { 

    public final void flipper() { 
    System.out.println("Clidlet"); 
    } 

    public static void main(String[] args) { 
    new Clidlet().flipper(); 
    } 
} 

방법 민간 최종 무효 플리퍼() 슈퍼 클래스의는 마지막 방법으로 여기에서 우리는 자신의 서브 클래스에 의해 쟁이를 통해 그들은 수 없다는 것을 알고 있기 때문에 그것의 마지막.

Clidlet 클래스 차이이 하나 공개이다 공개 최종 공극 플리퍼() 동일한 이름의 방식 방법이있다. 그래서 내 질문은이 액세스 지정자가 여기에서 재정의하는 것과 관련이 있습니까? 이 수퍼 클래스 메서드는 private이기 때문에 동일한 이름, 동일한 인수, 동일한 반환 형식을 사용하는 subclass에서 사용할 수 있지만 재정의 할 수는 없습니까?

+0

컴파일하려고하면 어떻게됩니까? –

+0

@JBNizet 예상대로 컴파일되고 실행됩니다. 후드에서 일어나는 일이 명백하지 않을 것입니다 (예 : 기본 메소드가 '보호됨'또는 '최종'이없는 '공용'인 경우) 예제 프로그램의 명백한 결과는 구조가 완전히 다른). 예제가 어떤 문맥인지는 모르지만 새로운 프로그래머에게 보여줄 미묘한 오류가있는 아주 나쁜 예입니다. 예를 들어 하위 클래스에서 볼 수없는'private '메소드의 포인트를 구체적으로 보여 주려하지 않는 한 (이는 의심 스럽습니다. 'main'의 테스트 코드에 기초하여). –

+0

잘 컴파일됩니다. – CodeSac

답변

1

메서드를 재정의하지 않습니다. private 메소드는 상속되지 않으며 서브 클래스가 액세스하거나 서브 클래스에서 볼 수 없습니다. 방법에 privatefinal을 갖는 것은 다소 어리 석다.

귀하의 Clidlet 클래스는 실제로 단순히 Clidder에있는 것과 관련이 flipper()라는 새로운 방법을 정의 Clidder에서 해당 메소드를 오버라이드 (override)하지 않습니다.

정확히 @Override 키워드가 존재하는 이유입니다. 그것을 사용하면 다음과 같은 미묘한 오류를 방지 할 수 있습니다. 그들은 그 책에 넣어 가지고하는 것이 개인의 기준에 대한 액세스를 가지고 있지 서브 클래스의 구체적 예 않는 한, 매우 가난한 예입니다

public class Clidlet extends Clidder { 

    @Override public final void flipper() { 
    System.out.println("Clidlet"); 
    } 

    public static void main(String[] args) { 
    new Clidlet().flipper(); 
    } 

} 

: 다음 코드는 실제로 아무것도 오버라이드 (override)되지 flipper() 때문에 컴파일 실패 행동 양식.

0

이것은 실제 오버라이드가 아니며 하위 클래스는 동일한 이름을 가진 새로운 메소드를 간단히 선언합니다. 부모 클래스의 메소드가 private이기 때문에 하위 클래스가이를 볼 수 없으며 컴파일러에 혼란이 없으므로이 작업 만 수행 할 수 있습니다.

더 자세한 답변은 here입니다.

관련 문제