2017-12-13 3 views
0

그것은 매우 어리석은 것처럼 보이지만 정말 혼란 스럽습니다. 코드는 아래를 참조하시기 바랍니다 :수퍼 클래스의 보호 된 메서드가 다른 패키지의 하위 클래스에 표시됩니까?

package com.one; 
public class SuperClass { 
    protected void fun() { 
     System.out.println("base fun"); 
    } 
} 
---- 
package com.two; 
import com.one.SuperClass; 
public class SubClass extends SuperClass{ 
    public void foo() { 
     SuperClass s = new SuperClass(); 
     s.fun(); // Error Msg: Change visibility of fun() to public 
    } 
} 

내가 오라클 문서뿐만 아니라 here에서 읽고, 보호 된 멤버가 다른 패키지도의 서브 클래스에서 볼 수 있습니다. 그래서 fun()는 패키지 2의 SubClass에 표시되어야합니다. 그런데 왜 오류가 있습니까?

내가 몹시 분명한 뭔가를 매우 분실하고 있습니까?

+3

이 메소드는'SubClass' 인스턴스의 인스턴스에서 볼 수 있습니다. 그래서 this.fun()을 호출 할 수 있습니다. 그러나 다른 인스턴스를 생성하고 그 메소드를 호출하려고하면'SubClass'의 인스턴스가 ** SuperClass의 인스턴스 **와 아무런 관련이 없으므로 허용되지 않습니다. – Zabuza

+2

"보이기"는 전체 그림을 제공하지 않습니다. 'this.fun()'또는 간단히'fun()'와 같은 메소드를 호출 할 수 있지만'SuperClass'의 새로운 인스턴스를 생성 할 때'SubClass'가 "일반 "SuperClass의 클라이언트는 또한 그것으로부터 상속 받음에도 불구하고. – dasblinkenlight

+0

이제 누락 된 링크가 있습니다. :) 감사 – Dexter

답변

2

Java Language Specification

보호 된 멤버 또는 객체의 생성자가 객체의 구현에 대한 책임이 단지 코드에 의해 선언 된 패키지 외부에서 액세스 할 수 있습니다 말한다. 그게 무슨 뜻인지

는 원래 클래스의 패키지 외부의 서브 클래스를 작성하는 경우, 각 개체가 다른 개체에 자체에 슈퍼 클래스의 보호 방법을 부르지 만 수 없다는 것입니다.

예를 들어 sthis과 다른 개체이기 때문에 s.fun()으로 전화 할 수 없습니다. 그러나이 객체는 또는 fun()으로 fun 메서드를 호출 할 수 있습니다.

1

보호 된 메서드는 내부의 하위 클래스에서만 볼 수 있습니다. SuperClass이라는 새 인스턴스를 만들면 외부에서 액세스합니다.

관련 문제