我在两个不同的包中有以下两个类。我的访问修饰符实例方法是受保护的,这意味着相同或不同包中的任何子类都可以访问它吗?但是,在Eclipse中,我在第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();
}
}
答案 0 :(得分:3)
受保护的访问修饰符不授予package
访问权限,意味着同一个包中的类不被授予对受保护字段的访问权限。
Protected确实授予对从包含该字段且位于同一包中的基类(继承关系)派生的类的访问权。
因此,要满足受保护级别访问,必须满足两个条件:
在您的示例中,只满足其中一个条件(类之间存在继承关系),但它们不在同一个包中。
如果您将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.");
}
}