2012-04-24 2 views
3

정적 메서드를 재정의 할 수없는 모든 곳에서 작성되지만 액세스 지정자를 public에서 protected로 축소하려고하면 오류가 발생합니다. 예를 들어자바에서 정적 메서드 오버라이드의 이상한 경우

public class StaticOverrideFunda { 

    public static void foo(){ 
     System.out.println("Parent Foo"); 
    } 
} 

public class B extends StaticOverrideFunda{ 


    protected static void foo(){ 
     System.out.println("Child Foo"); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     B.foo();    
    } 
} 

가 는

상속 방법 따라서

의 가시성을 줄일 수 없습니다 그것은 최우선 규칙을 따르고 insense, 어떻게 우리가 말하는 올 foo를 오버라이드 (override)되지 않는 말한다 B 급? 왜 우리가 숨기거나 음영하고 덮어 쓰지 않는다고 말합니까?

+4

"우선하는 규칙을 따르고 있습니다": false. 그것은 "상속 된 메소드의 가시성을 줄일 수 없습니다"절을 깨고 있습니다. 당신의 질문은 정확히 무엇입니까? – Viruzzo

답변

8

그것은 재정과 같은 규칙 중 일부는 다음,하지만 그게 최우선 의미하지 않습니다. 이 경우, "재정 및 숨기기의 요구 사항"를 section 8.4.8.3 of the JLS의 규칙을,이다 :

액세스 수정 (§6.6) 최우선의 또는 오버라이드 (override) 또는 숨겨진 방법으로 적어도 많은 액세스를 제공해야합니다 방법을 숨기기 다음과 같이 [...]

그것은 여전히 ​​방법은 다형 적으로 호출 할 수 없습니다 것처럼, 무시하지 - 당신은 때로는 때로는 StaticOverrideFunda.foo를 호출 끝날 전화를 쓸 수 없습니다 최후에 전화 B.foo; 타겟은 컴파일 타임에 완전히 결정됩니다.

나머지 8.4.8을 검토해 볼 가치가 있습니다. 을 인스턴스 메서드에서 발생하는 것으로 재정의합니다.

+2

흠, 그건 나에게 놀라운 일이다. 은폐 방법이 숨기는 방법보다 가시성이 떨어지는 것을 허용하지 않는 것은 무엇입니까? 수퍼 클래스 메소드를 호출 할 수있는 모든 것이 서브 클래스도 호출 할 수 있어야하기 때문에 다형성으로 호출 할 수있는 메소드에 대해 의미가 있습니다. 그러나 오버라이드보다는 숨기는 정적 메서드의 경우에는 해당되지 않습니다. – Wyzard

+1

@Wyzard : 가시성 감소를 막는 것이 약간 이상하다는 데 동의합니다. 그러나,'Superclass.foo()'로 해석되는 private 메소드 인'Subclass.foo()'를 명시 적으로 호출하는 상황을 피할 수 있습니다. 어느 쪽이든 그것은 JLS에 따라 정확하게 작동하며 여전히 무시하지는 않습니다. 어쨌든 수퍼 클래스 정적 메서드와 같은 이름을 가진 서브 클래스에서 정적 메서드를 선언하는 것에 대해서는 솔직히 말하면 좋습니다. 혼란으로 이어질 것입니다. –

-1

자신이 질문에 답글을 게시했습니다. 재정의한다는 것은 동일한 방법으로 하위 클래스에 다른 코드가 있음을 의미합니다. 정적 메서드를 재정의 할 수 없으므로 액세스 지정자를 수정하여 가시성을 유지할 수 없습니다.