40

protected 修飾子と package private 修飾子の違いに関するさまざまな記事を見てきました。これら2つの投稿の間で矛盾していることを1つ見つけました

  1. 「パッケージ プライベート」メンバー アクセスは、デフォルト (修飾子なし) アクセスと同義ではありませんか?

    これで受け入れられた答えはそれを言います

    protected 修飾子は、メンバーが (package-private と同様に) 独自のパッケージ内でのみアクセスできることを指定し、さらに、別のパッケージ内のそのクラスのサブクラスによってアクセスできることを指定します。

  2. ここでJavaサブクラスで保護された修飾子の動作が異なるのはなぜですか?

    これで受け入れられた答えはそれを言います

    保護されたレベルのアクセスを満たすには、次の 2 つの条件を満たす必要があります。

    • クラスは同じパッケージ内にある必要があります。
    • 継承関係がある必要があります。

矛盾していませんか?他の記事の私の理解から、最初の投稿は、protected == package-private + subclass in other packageという正しい答えを与えます。

このステートメントが正しい場合、17 行目のサブクラス Cat で次のエラー メッセージが表示されてこのコードが失敗する理由

The method testInstanceMethod() from the type Animal is not visible 

スーパークラスとサブクラスの私のコードは以下のとおりです。

package inheritance;

public class Animal {

    public static void testClassMethod() {
        System.out.println("The class" + " method in Animal.");
    }
    protected void testInstanceMethod() {
        System.out.println("The instance " + " method in Animal.");
    }
}

package testpackage;

import inheritance.Animal;

public class Cat extends Animal{
        public static void testClassMethod() {
            System.out.println("The class method" + " in Cat.");
        }
        public void testInstanceMethod() {
            System.out.println("The instance method" + " in Cat.");
        }

        public static void main(String[] args) {
            Cat myCat = new Cat();
            Animal myAnimal = myCat;
            myAnimal.testClassMethod();
            myAnimal.testInstanceMethod();
        }
    }

上記のコードが失敗する理由を明確にしてください。それは非常に便利です。ありがとう

4

3 に答える 3

5

保護されたアクセスでは、メンバーは同じパッケージでアクセスされ、別のパッケージの継承されたクラス メンバーにもアクセスできます。

パッケージ アクセスでは、同じパッケージ内のクラスのメンバーにアクセスできます。パッケージ アクセスでは、他のパッケージのクラス メンバーにはアクセスできません。

于 2017-01-10T18:45:48.947 に答える