为什么受保护的修饰符在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?

    下一篇: Implementing rights with ASP.NET Identity