1

2 つの異なるパッケージに次の 2 つのクラスがあります。インスタンス メソッドのアクセス修飾子は保護されています。これは、同じまたは異なるパッケージ内のサブクラスがそれにアクセスできることを意味します。ただし、Eclipse では、サブクラスCatの 17 行目に次のメッセージが表示されます。

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

1 に答える 1

3

protected アクセス修飾子はpackage、同じパッケージ内のクラスが保護されたフィールドへのアクセスを許可されていないことを意味するアクセスを許可しません。

Protected は、フィールドを含み、同じパッケージ内にある基本クラス (継承関係) から派生したクラスへのアクセスを許可します。

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

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

あなたの例では、これらの条件の1つだけが満たされています(クラス間に継承関係があります)が、それらは同じパッケージにはありません。

コードがコンパイルAnimalされるのと同じパッケージに移動した場合。Cat

package testpackage;

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.");
    }
}
于 2013-08-08T08:31:35.120 に答える