1

我在两个不同的包中有以下两个类。我的实例方法的访问修饰符受到保护,这意味着相同或不同包中的任何子类都可以访问它吗?但是,在 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 确实授予对从包含该字段的基类(继承关系)派生的类的访问权限,并且这些类位于同一包中。

因此,要满足受保护级别的访问,必须满足两个条件:

  1. 这些类必须在同一个包中。
  2. 必须有继承关系。

在您的示例中,仅满足其中一个条件(类之间存在继承关系),但是它们不在同一个包中。

如果您移动到与代码编译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 回答