2010-05-12 4 views
3

왜 Java에서 수퍼 클래스의 보호 된 멤버는 다른 패키지의 간접 하위 클래스에서 액세스 할 수 없습니까? 다른 패키지의 직접 하위 클래스가 수퍼 클래스의 보호 된 멤버에 액세스 할 수 있다는 것을 알고 있습니다. 모든 하위 클래스가 상속 된 보호 된 멤버에 액세스 할 수 있다고 생각했습니다.수퍼 클래스의 보호 된 멤버가 Java의 간접 하위 클래스에서 액세스 할 수 없음

편집

죄송합니다 초보자의 실수, 서브 클래스는 간접적 인 슈퍼 클래스 '보호 된 멤버에 액세스 할 수 있습니다.

+2

어떤 코드 샘플? – OscarRyz

+1

구체적인 예를들 수 있다면 어떤 의미인지 쉽게 알 수 있습니다. –

+0

그는 어셈블리 a1에 클래스 a가 있음을 의미합니다. 이 클래스에는 보호 된 멤버가 있습니다. 그러나, 그는 어셈블리 a2를 확장하는 클래스 b에서 보호 된 멤버에 액세스 할 수 없다고 생각합니다. –

답변

11

아마도 조금 혼란 스러울 것입니다.

여기 내 빠른 데모입니다 및 보호 속성을 액세스하는 간접적 인 서브 클래스를 보여줍니다

// A.java 
package a; 
public class A { 
    protected int a; 
} 

// B.java 
package b; //<-- intermediate subclass 
import a.A; 
public class B extends A { 
} 

// C.java 
package c; //<-- different package 
import b.B; 
public class C extends B { // <-- C is an indirect sub class of A 
    void testIt(){ 
     a++; 
     System.out.println(this.a);//<-- Inherited from class A 
    } 
    public static void main(String [] args) { 
     C c = new C(); 
     c.testIt(); 
    } 
} 

그것은 당신이 볼 때, 속성 a이 서브 클래스 C에서 액세스 할 수있는 1

를 인쇄합니다.

우리가 시도하는 코드를 표시하면 혼란이 어디에서 발생하는지 파악할 수 있습니다.

+1

짐작하게 말하자면,'import b.B' – OscarRyz

+1

과 같이'import' 선언을 잊어 버려야합니다. 대부분의 컴파일러가 확장 클래스가 존재하지 않는다고 불평 할 것이기 때문에 상당히 어려울 것입니다. – Random

0

아마도 문제는 그가 다른 인스턴스의 보호 된 필드에 액세스하려고 시도하지만 그의 인스턴스는 액세스하지 않는 것일 수 있습니다. 과 같은 :

package a; 
public class A{ 
    protected int a; 
} 

package b; 
public class B extends A{ 

} 

package c; 
public class C extends B{ 
    public void accessField(){ 
     A ancient = new A(); 
     ancient.a = 2; //That wouldn't work. 

     a = 2; //That works. 
    } 


} 
+0

OP가 알아 낸 것 같습니다. –

관련 문제