2017-06-23 15 views
-1
一方、スーパー基準で保護されたインスタンス変数にアクセスすることができません

私ができる午前この場合、スーパークラス参照スーパークラス参照で保護されたスーパークラスインスタンス変数にアクセスできませんか?

package Test; 
import Different.Exam; 

public class Test { 
    protected int a = 4; 

    protected int add(int a, int b){ 
     return a+b; 
    } 
} 

サブクラス

package Different; 

import Test.Test; 

public class Exam extends Test { 
    protected void methodWithDefaultAccess(){ 
     Exam exam = new Exam(); 
     exam.add(1, 2); 
     System.out.println("A in super class is.. "+a); 
     System.out.println("A in super class is .." exam.a); 
    } 
} 

と同じスーパークラスの保護機能にアクセスすることができますスーパークラス参照で保護された関数にアクセスするが、スーパークラス参照でインスタンス変数にアクセスすることはできない。

+0

Test t = new Exam();テストクラスでgetterとsetterを提供する – Frank

+0

これはどの言語ですか? Java? C#?使用しているプログラミング言語で質問にタグを付ける必要があります。 – jwodder

+0

テストt =新しい試験();ゲッターなしでは動作しません。私はgetterとsetterの意義を理解していますが、関数とインスタンス変数がどのようにアクセスされているかに違いがあるのか​​どうかを知ろうとしています。 –

答えて

0

Test exam = new Exam();exam.aにアクセスできなくなるように質問がなぜ参照を宣言されている場合、Java言語仕様(http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2が)ことを述べて:オブジェクトの保護されたメンバーまたはコンストラクタがパッケージの外側からアクセスすることができる

そのオブジェクト(...)の実装を担当するコードによってのみ宣言されています。 Cを保護されたメンバーが宣言されているクラスとする。アクセスは、CのサブクラスSの本体内でのみ許可されます。さらに、(...)アクセスがフィールドアクセス式E.Id、Eが一次式、またはメソッド呼び出し式E.の場合Eの型がSであるかSのサブクラスである場合にのみ、アクセスが許可される。

普通の英語で:子クラス内から参照がの親クラスで宣言されている保護されたメンバにアクセスすることはできません。タイプが親クラスです。参照のタイプは子クラス(またはその子孫クラス)でなければなりません。

関連する問題