2017-05-16 5 views
-3

は、Javaアクセス修飾子のいくつかのネストの例です。クラスが他のクラスである型を持つ属性を持つとき、私は答えを明確に把握できません。java access修飾子 - タイプが他のクラスである属性の可視性。なぜそれが見えるかどうか?

package packageX; 
import packageY.*; 

public class A { 
    public int x; 
    private int y; 
    protected int z; 

    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x); 
     System.out.println(y); 
     System.out.println(z); 

     System.out.println(objA.x); 
     System.out.println(objA.y); 
     System.out.println(objA.z); 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible 
     System.out.println(objC.z);//?? why visible? 
    } 
} 

class B{ 
    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x);//not visible 
     System.out.println(y);//not visible 
     System.out.println(z);//not visible 

     System.out.println(objA.x); 
     System.out.println(objA.y);//not visible 
     System.out.println(objA.z); 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible 
     System.out.println(objC.z);//?? why visible? 
    } 
} 



package packageY; 
import packageX.*; 

public class C extends A{ 
    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x); 
     System.out.println(y);//not visible 
     System.out.println(z); 

     System.out.println(objA.x); 
     System.out.println(objA.y);//not visible 
     System.out.println(objA.z);//not visible//??? why not visible? 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible//??? why visible? 
     System.out.println(objC.z); 
    } 

} 

class D{ 
    public A objA; 
    public C objC; 

    void test(){ 
     System.out.println(x);//not visible 
     System.out.println(y);//not visible 
     System.out.println(z);//not visible 

     System.out.println(objA.x); 
     System.out.println(objA.y);//not visible 
     System.out.println(objA.z);//not visible 

     System.out.println(objC.x); 
     System.out.println(objC.y);//not visible 
     System.out.println(objC.z);//not visible//??? why not visible 
    } 
} 

私はいくつかの行を理解できませんか?属性が表示されているかどうかを説明できますか? CAを拡張し、Ayはプライベートにしたので、

+3

画像ではなくテキストとして関連コードをすべて投稿してください。 – biziclop

+1

関連するすべてのクラス(つまり、「A」)も投​​稿してください – Berger

答えて

0

これは、Access https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

y説明しますがCには表示されません。従ってCyを見ることができません。

zはサブクラスがzと表示されるように保護されています。

クラスBは他のクラスから継承せず、これらの変数を定義していないため、これらの変数は表示されません。

クラスB objA.yはプライベートであるためアクセスできません。それを宣言するクラスの外部からプライベート変数にアクセスすることはできません。

objC.zは、保護されたメンバーがサブクラスによってアクセスできるため、表示されます。

私が提供したリンクを読んでください。それは最初の表でこれを説明します。

+0

はい、私はx、y、zの大文字小文字を知っています。私が疑問に思うのは、objAとobjCの場合です。例えば、objC.zはクラスAで見ることができますが、Cが他のパッケージでAで定義されているので、objC.z(同じパッケージとそのサブクラスで表示されるはずです)はA – pota

+0

では表示されませんが、isn 'tはCのスーパークラスですか? – pota

+0

ObjC.zはA.から継承されます.zはaに属します。これはCのインスタンスによってアクセスできるように保護されています。Cのインスタンスはどのクラスでも作成でき、zにアクセスできます。スーパークラスがサブクラスのインスタンスを作成しても、 – Allan

0

多分、いくつかの基本的なドキュメントを読む時間ですか?

private int a - のみ、このクラスでは見え

protected int a - このクラス

と同じパッケージ内のすべてのクラスから見える -

int aこのクラスを拡張し、このクラスでは、すべての子どもたちのクラスに表示public int a - 他のクラスからもご覧になれます

+0

CクラスのobjA.zについてCはCのサブクラスであるため、CではobjA.z(protected)は可視である必要がありますが、 – pota

+0

ではありません。ObjAはobjCではなく、objCに属するzだけがobjC内で可視です。他のオブジェクトからではありません。必要な場合は、 'public'かクラスが同じパッケージに含まれているかどうかを指定します。 – Vadim

関連する問題