2017-12-30 8 views
-2

나는 다음과 같은 코드를 가지고 : 나는 met2()를 호출 할 때클래스

package pack1; 

public class Father { 
    public String met1(){ 
     return "c "; 
    } 
    protected String met2(){ 
     return "b "+met1(); 
    } 
} 




package pack2; 
import pack1.Father; 

class Child extends Father { 
    public String met1(){ 
     return "a "; 
    } 
} 

class GrandChild extends Child { 
    public String met2(){ 
     return super.met2() + "z" ; 
    } 
    public static void main(String[] args){ 
     Father f = new GrandChild(); 
     System.out.println(f.met2()); // Compile error here 
    } 
} 

, 그것은 super.met2() 호출 GrandChild에서 구현 된 버전을 실행, 그래서 그것은 즉 (아이에 구현 된 버전을 실행을 아이가 met2()을 구현하지 않기 때문에 아버지의 버전). 하지만 컴파일러는 "met2()이 보이지 않습니다"라고 말하면서, met2()이 "보호"되어있을 때 GrandChild (간접적으로 아버지의 하위 클래스)에서 호출하면 어떻게됩니까? met2()을 인식해야합니다. 왜냐하면 서브 클래스와 그 보호 된 서브 클래 싱에서 호출하기 때문입니다 !!

감사합니다.

+1

당신은이 사람에 대한 액세스 지정자에 대해 이야기하고 있습니까?>'String met2()'? –

+1

위 코드는 "met2() is not visible"오류를 생성하지 않습니다. –

+0

GrandChild의 m2()가 기본값 이었으므로 코드 조각 –

답변

1

부모 클래스에서 권한을 약화시킬 수 없습니다. met2()부터 Father까지는 protected이며, protected 또는 public을 사용하여 무시할 수 있습니다.

권한 액세스를 지정하지 않으므로 기본값은 package protected이며, 이는 protected보다 약합니다.

은 언어 자체에서 제한하고 Liskov substitution principle (LSP)

UPDATE에게 다음과

Father는 "어린이"가 아닌 다른 패키지에있는 경우, 당신은 순서 public으로 met2()를 선언해야합니다 하위 클래스에서 액세스 할 수 있습니다.

+0

좋습니다.하지만 공개 설정을 공개 (공개)로 변경하면 마지막 오류 인 "met2()가 표시되지 않습니다."가 계속 표시됩니다. 왜? 나는 met2()가 Father 클래스에서 "protected"라고 선언했는데, 왜 GrandChild 클래스에서 보이지 않는가? –

+0

@AlanCross - 당신이 말하는 오류 메시지에 해당하도록 질문의 코드를 업데이트 해 주실 수 있습니까? –

+0

@AlanCross - 코드가 잘 컴파일 된 것처럼 보입니다. https://ideone.com/uqgslj –

0

오버라이드 할 때 하위 클래스 메서드의 가시성을 줄일 수 없기 때문입니다.

m2()Father 클래스이므로 보호됩니다. m2()GrandChild 클래스에는 기본 액세스 지정자를 사용할 수 없습니다. 공개 또는 보호되어야하지만 하위 클래스의 가시성을 낮추기 때문에 기본값이 아니어야합니다.