2011-07-29 17 views
3

これは例ですJava™SCJP認定A包括的プライマー - 第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認定Aプログラマーズガイドの包括的な入門書第3版Khalid A. Mughal Rolf W. Rasmussen **の例です。理解できません。 –

+0

著者はA、Bなどのクラス名を使用した例を提供しないことを願っています。 – Joeblackdev

答えて

3

現在受け入れている回答では質問に答えません。あなたがBまたはCの体内からAのインスタンスのメンバーzにアクセスすることができない理由は説明しています。あなたはC内からBのインスタンスのメンバーzにアクセスすることはできませんしかし、なぜ質問が尋ねます。

理由はBCのサブクラスではないということです。 Java仕様の6.6.2.1節を参照してください。

保護されたメンバーが宣言されているクラスをCとします。アクセスのみ加え

C.

のサブクラスSの本体内に許可され、Idは、インスタンスフィールドまたはインスタンスメソッド、表す場合:アクセスは修飾名であると

をQ.Id QがExpressionNameある場合、次いでアクセスが許可された場合にのみ発現QのタイプはS又は

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

S.のサブクラスである場合

(太字鉱山)

obj3はタイプCのものであり、CBのサブクラスであるため、だから、B以内にあなたはobj3.zを言うことができます。

しかし obj2はタイプ Bであり、 Bない Cのサブクラスであるため C以内にあなたは、 obj2.zを言うことはできません。


保護の意味を要約する:

は、保護されたメンバーは、クラスAの本体内で宣言されていると仮定します。

(1)Aを含むパッケージのどこからでも保護されたメンバーにアクセスできます。

(2)また、別のパッケージで定義されたサブクラスASは、Sからではなく、クラスのインスタンスに継承Sのインスタンスまたはクラスのインスタンスで保護されたメンバーにアクセスできるS継承から。

この最後の節は、この質問に答えるための重要なポイントです。

1

保護部材できのみは、それが宣言されていますクラスのサブクラスによってアクセスさ又はクラス同パッケージ保護されたメンバーが宣言されているクラスとして宣言します。あなたのケースのクラスBとCは、それは、あなたがAと同じパッケージにクラスBとCを移動する場合は、クラスAへの参照を経由して「Z」にアクセスできない理由のクラスAのものと異なるパッケージで宣言されています働くでしょう。

これは、異なるパッケージのクラスで 'z'が宣言されているため、クラスCのobj2.zにアクセスできないためです。

+0

これは、メンバアクセスが2番目のサブクラスで継承されていないことを意味しますか? –

+0

私はコンパイラのようには思えません。 –

+1

あなたがSCJPのために勉強している場合(私が行ったように)、保護されたメンバーが見えたら、アクセスするために「パッケージと子供たち」と考えてください。つまり、同じパッケージ内のサブクラスとクラスのみが保護されたメンバ、期間にアクセスできます。研究の幸運のベスト。 – Joeblackdev

関連する問題