gpt4 book ai didi

java - 为什么 protected 修饰符在 Java 子类中的行为不同?

转载 作者:行者123 更新时间:2023-11-29 05:39:36 24 4
gpt4 key购买 nike

我在两个不同的包中有以下两个类。我的实例方法的访问修饰符是 protected ,这意味着相同或不同包中的任何子类都可以访问它吗?但是,在 Eclipse 中,我在第 17 行的子类 Cat 上看到以下消息

The method testInstanceMethod() from the type Animal is not visible 

我的父类(super class)和子类代码如下。

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();
}
}

最佳答案

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

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

所以要满足 protected 级别的访问必须满足两个条件:

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

关于java - 为什么 protected 修饰符在 Java 子类中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18121351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com