19

2 つの異なるパッケージに 2 つのクラスがあります。

package package1;

public class Class1 {
    public void tryMePublic() {
    }

    protected void tryMeProtected() {
    }
}


package package2;

import package1.Class1;

public class Class2 extends Class1 {
    doNow() {
        Class1 c = new Class1();
        c.tryMeProtected(); // ERROR: tryMeProtected() has protected access in Class1
        tryMeProtected();  // No error
    }    
}

から継承されているため、このメソッドを参照しているtryMeProtected()ため、呼び出しにエラーがない理由を理解できます。Class2Class1

しかし、 のオブジェクトがusing Class2のオブジェクトでこのメソッドにアクセスできないのはなぜ でしょうか?Class1c.tryMeProtected();

4

7 に答える 7

17

保護されたメソッドは、パッケージ外のサブクラスでの継承によってのみアクセスできます。したがって、2番目のアプローチがtryMeProtected();機能します。

以下のコードは、保護されたメソッドの継承されたバージョンを呼び出していないため、コンパイルされません。

 Class1 c = new Class1();
 c.tryMeProtected(); // ERROR: tryMeProtected() has protected access in Class1

詳細については、このスタックオーバーフローリンクに従ってください。

于 2013-11-13T08:56:03.503 に答える
1

Java Protected Access修飾子定義に従って、スーパークラスで保護されていると宣言されているメソッドは、他のパッケージのサブクラスまたは保護されたメンバーのクラスのパッケージ内の任意のクラスによってのみアクセスできます。

クラスのオブジェクトを作成して保護されたメソッドにアクセスすることはできません。したがって、Protected メソッドにアクセスするには、スーパークラスを拡張する必要があります (これは、2 番目の呼び出しが正しいことを説明しています)。

于 2013-11-13T09:08:25.353 に答える
0

それは2つの方法で達成できます

1. Child クラスのオブジェクトを作成してから、Parent クラスの保護されたメソッドにアクセスします。

パッケージ 1

public class Class1 {
    protected void m1() {
        System.out.println("m1 called");
    }
}

パッケージ2

public class Class2 extends Class1 {

    public static void main(String[] args) {
        Class2 class2 = new Class2();
        class2.m1();
    }
}

2. または、Child クラスからメソッドを直接呼び出す

eg tryMeProtected();

于 2014-02-04T11:09:40.650 に答える