1

保護されたアクセスとは、パッケージに関係なく、パッケージおよびサブクラス内のメンバーにアクセスできることを意味することを理解しています。理解しにくいのは、サブクラスで、保護されたメンバーを持つクラスのオブジェクトを作成すると、「見えない」というエラーが発生することです。これは、次のコード (YiFan Wu による回答に基づく拡張バージョン) によって示されます。パッケージの内外に同じコード行があることに注意してください。したがって、私は2つの質問があります:

  1. オブジェクトを使用するとすべてが変わるのはなぜですか?
  2. このオブジェクト アクセスの違いは、パッケージ内では発生しません。つまり、クラス A1 の test() を参照してください。

    package a;
    public class A{
        protected int a;
    }
    class A1{
        public void test(){
            A ref = new A();
            ref.a=8;    // no issue
        }
    }
    
    package b;
    public class B extends A{
    }
    
    package c;
    public class C extends B{
        public void accessField(){
            a = 2;   //That works.
    
    
            A ref = new A();
            ref.a=8;   // not visible!!
        }
    

    }

どんな助けでも大歓迎です...

ありがとう、ショーン。

4

2 に答える 2

2

Cは別のパッケージに含まれており、のサブクラスではなくA、を作成しているためです。A

その頭の上の質問を裏返します:なぜそれが見えるべきですか?あなたはすでにパッケージングルールを知っています、そしてあなたはすでにフィールドアクセスルールを知っています。

于 2013-02-06T17:27:15.800 に答える
1

最後のケースでは、A オブジェクトの新しいインスタンスを作成しています。これは、サブクラスのインスタンスを使用してその親クラスのメンバーにアクセスするのとはまったく異なります。

サブクラスを作成すると、最初に親クラスが作成されます。親インスタンスの保護されたメンバーにアクセスできる唯一のサブクラスは、親クラスが作成されたサブクラスです。

于 2013-02-06T17:30:12.297 に答える