父 class 访问子 class 的受保护成员 Java

Parent class accessing protected members of subclasses Java

我有以下代码,我认为 Oracle 的教程没有完全解释这些代码。

package visibilidad;

import otropaquete.*;

public class ejemplo2 extends Test {
    protected int prot = 4;
}



package otropaquete;

import visibilidad.*;

public class Test {
    public void metodopublico() {
        ejemplo2 a = new ejemplo2();
        System.out.println(a.prot);
        Hija b = new Hija();
        System.out.println(b.prot);
    }
}

class Hija extends Test {
    protected int prot = 3;
}

基本上,我想做的是从父 class 访问子 class 的受保护成员。有趣的是,当 subclass 在另一个包中定义时,这会产生编译时错误 如果 subclass 在同一个 class 中定义,则运行完美。

我想知道标准是否考虑了这种行为。

protected 修饰符也允许从同一个包进行访问。参见 the documentation

Java 中有 4 种不同的访问修饰符:

(No Modifier) - Visible to the package.

(private) - Visible to the class only.

(public) - Visible to the world.

(protected) - Visible to the package and all subclasses.

这是一个reference

使用 protected 修饰符意味着只有该包的其他 classessubclasses 可以访问 field/method。在您的情况下,同一包中的 class 工作正常,而不同包中的 class 会抛出编译时错误,这正是应该发生的情况。

The docs 非常明确:protected 字段可在 Class、包和子类级别访问。由于父类既不是子类也不在同一个包中 - 该字段不可访问并且您遇到编译错误。

来自 Oracle 文档的访问级别 table:

               Access Levels
Modifier    Class   Package Subclass    World
public      Y       Y       Y           Y
protected   Y       Y       Y           N
no modifier Y       Y       N           N
private     Y       N       N           N