为什么受保护的修饰符在Java子类中的行为有所不同?
我有两个不同的包中有两个类。 我的访问修饰符的实例方法是受保护的,这意味着在相同或不同包中的任何子类都有权访问它? 不过,在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();
}
}
受保护的访问修饰符不授予package
访问权限,因此同一个程序包中的类没有被授予对受保护字段的访问权限。
受保护不授予对包含该字段且位于相同包中的基类(继承关系)派生的类的访问权限。
所以要满足受保护的级别访问,必须满足两个条件:
在你的例子中,只有其中一个条件得到满足(类之间有继承关系),但它们不在同一个包中。
如果您将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.");
}
}
链接地址: http://www.djcxy.com/p/24105.html
上一篇: Why the protected modifier behave differently here in Java subclass?