子类成员变量对另一个子类的可见性

Subclass member variable's visibility to another subclass

我是运行一个测试程序,想了解更多成员变量的可见性,我创建了以下3个类:

ParentClass.java

public class ParentClass {
    protected int mMember;
}

ChildClass.java

public class ChildClass extends ParentClass {
    ChildClass() {
        mMember = 10;
    }
}

ChildChildClass.java

public class ChildChildClass extends ChildClass {
    ChildChildClass() {
        mMember = 5;
    }
}

ChildChildClassmMember 变量的 访问级别 是什么?是 public 还是 protected ?

ChildChildClass 中的

mMember 继承自 ParentClass,并且可见性没有改变 - 因此它仍然是 protected

它是protected,继承自父class。

mMemberParentClass 中声明为受保护修饰符。 ChildChildClass 扩展了 ChildClass,后者扩展了 ParentClassChildClass中的访问修饰符没有改变,因此protected是继承自ParentClass的ChildChildClass中的访问修饰符.

查看 oracle 文章以控制变量的访问修饰符。

提供对变量的最严格的访问,除非您需要不受限制的访问。

编辑:

通过重新定义对 mMember 的减少访问来更改您的 ChildClass 代码,如下所示

private int mMember;

一旦将访问修饰符更改为私有,ChildChildClass 将无法访问现在私有的 mMember。你会得到这个错误:The filed ChildClass.mMember is not visible

它会保持受保护状态,这与在 C++ 中不同,在 C++ 中取决于继承类型(public、受保护或私有)它保持不变。

C++ 允许这种继承的主要原因是它支持多重继承。但是,Java 不支持它。因此,它只是通过保持 super class.

中的访问级别来简化它

问题表述不当。您只能在声明点设置可见性。在使用点,您要么看到变量,要么看不到变量。因此,你不能问"what is the visibility when I access the variable?",只能问"Can I access the variable or not?"。对于您的情况,这意味着:ChildChildClassParentClass 的(n 个间接)子代并且 mMember 被声明为 protected,因此它在 ChildChildClass 中可见。有关详细信息,请参阅 the Oracle page about Access Modifiers