2011-07-29 4 views
3

이것은 예입니다. Java ™ SCJP 인증 프로그램 안내서 A Comprehensive Primer - 제 3 판 - Khalid A. Mughal Rolf W. Rasmussen 나는 이해할 수 없다.하위 클래스 인 하위 클래스의 보호 된 멤버에 액세스 할 수 없음

다른 패키지에 정의 된 하위 클래스로 상속하지 않으면 보호 된 멤버에 액세스 할 수 없다는 것을 알고 있습니다.

하지만 하위 클래스의 하위 클래스에서 액세스 할 수없는 이유는 아직 이해할 수 없습니다.

예는

A.java은 다음

package packageA; 
public class A { 
    protected int z; 
} 

B.java

package packageB; 

import packageA.A; 

public class B extends A { 

    void action(A obj1, B obj2, C obj3) { 
     z = 10;  // z in B - Works 
     obj1.z = 10; // Won't work for obvious reason 
     obj2.z = 10; // z in B - Works 
     obj3.z = 10; // z in C - Works 

    } 
} 

class C extends B { 

    void action(A obj1, B obj2) { 
     z = 10; // Works 
     obj1.z = 10; // Won't work for obvious reason 
     obj2.z = 10; // z in B - WHY DOESN'T THIS WORK????? 

    } 
} 
+0

학술 활동입니까? 아니면 이와 같은 코드를 작성하려고하십니까? – jiggy

+0

@jiggy ** Java ™ SCJP Certification A Comprehensive Primer 제 3 판 Khalid A. Mughal Rolf W. Rasmussen **에 대한 프로그래머 지침서의 예입니다. 이해할 수 없습니다. –

+0

필자는 저자가 'A', 'B'등과 같은 클래스 이름을 사용하는 예제를 제공하지 않기를 바랄뿐입니다. – Joeblackdev

답변

3

현재 승인 된 답변은 질문에 대답하지 않습니다. 그 이유는 B 또는 C의 본문에서 A 인스턴스의 z 멤버에 액세스 할 수없는 이유입니다. 그러나이 질문은 왜 z의 인스턴스 BC에서 액세스 할 수 없는지 묻습니다.

BC의 하위 클래스가 아닙니다. Java 사양, 6.6.2.1 절을 읽으십시오.

C를 보호 된 멤버가 선언 된 클래스라고합시다. 액세스 만 또한

C.

의 하위의 S의 신체 내에서 허용되며 이드 다음 인스턴스 필드 또는 인스턴스 메소드 나타내면 : 액세스가 수식 명이면

을 Q.Id Q는 ExpressionName이고, 다음 액세스가 허용되는 경우에만 발현 Q의 종류 나 S

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2.1

,691 S.의 서브 클래스 인 경우

obj3 유형 C의, 그리고 CB의 서브 클래스이기 때문에 그래서 B에서 당신이 obj3.z 말할 수

(굵은 글자 광산).

그러나 obj2 유형 B이며 B하지 C의 서브 클래스이기 때문에 C 내에서 당신은 obj2.z을 말할 수 없습니다.

보호의 의미를 요약하면 :

보호 된 멤버는 클래스 A의 신체 내에서 선언하자.

(1) A이 들어있는 패키지의 어느 곳에서나 보호 된 회원에게 액세스 할 수 있습니다.

(2) 또한, 다른 패키지에 정의 된 서브 클래스 ASS, 에서 아니지만 클래스의 인스턴스에 상속 S 인스턴스 또는 클래스의 인스턴스에 보호 부재를 액세스 할 수 S 상속 행 .

마지막 절은이 질문에 대답 할 때 핵심 포인트입니다.

1

보호 회원 수 는 선언 년대 클래스의 하위 클래스에 액세스 할 또는 클래스의 동일 패키지 보호 된 멤버가 선언 된 클래스로 클래스 B와 C는 클래스 A와는 다른 패키지로 선언됩니다. 클래스 A에 대한 참조를 통해 'z'에 액세스 할 수 없습니다. 클래스 B와 C를 A와 동일한 패키지로 이동하면 작동합니다.

다른 패키지의 클래스에서 'z'가 선언되었으므로 클래스 C에서 obj2.z에 액세스 할 수 없습니다.

+0

회원 액세스가 두 번째 하위 클래스에서 상속되지 않는다는 의미입니까? –

+0

나는 컴파일러처럼 생각할 수 없다고 생각한다. –

+1

SCJP (내가 한 것처럼)를 공부하고 있다면, 보호 된 회원을 볼 때 "패키지와 키즈"라고 생각하십시오. 즉, 동일한 패키지의 하위 클래스와 클래스 만 보호 된 멤버 인 기간에 액세스 할 수 있습니다. 연구에 대한 행운을 빈다. – Joeblackdev

관련 문제