为什么受保护的修饰符在Java子类中的行为有所不同?

时间:2013-08-08 08:30:20

标签: java inheritance protected access-modifiers

我在两个不同的包中有以下两个类。我的访问修饰符实例方法是受保护的,这意味着相同或不同包中的任何子类都可以访问它吗?但是,在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();
        }
    }

1 个答案:

答案 0 :(得分:3)

受保护的访问修饰符不授予package访问权限,意味着同一个包中的类不被授予对受保护字段的访问权限。

Protected确实授予对从包含该字段且位于同一包中的基类(继承关系)派生的类的访问权。

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

  1. 这些类必须在同一个包中。
  2. 必须有继承关系。
  3. 在您的示例中,只满足其中一个条件(类之间存在继承关系),但它们不在同一个包中。

    如果您将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.");
        }
    }