为什么protected修饰符不同的表现在这里的Java子类?(Why the protected

2019-09-27 23:35发布

我有两种不同的封装以下两类。 我的实例方法访问修饰符是受保护的,这意味着在相同或不同的封装任何子类具有对它的访问权? 然而,在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();
        }
    }

Answer 1:

受保护的访问修饰符不授予package在同一封装内的含义类的访问不被授予访问受保护的领域。

保护不包含字段授权访问从基类(继承关系)衍生的类和在相同的包中。

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

  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.");
    }
}


文章来源: Why the protected modifier behave differently here in Java subclass?