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

时间:2015-11-13 18:34:21

标签: java inheritance visibility

我正在运行一个测试程序,以了解有关成员变量的更多信息。可见性,我创建了以下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;
    }
}

ChildChildClass mMember变量的访问级别是什么?是公开还是受保护

4 个答案:

答案 0 :(得分:3)

与C ++不同,它仍然受到保护,根据继承的类型(公共,受保护或私有),它保持不变。

C ++允许这种继承的主要原因是它支持多重继承。但是,Java并不支持它。因此,它只是通过将访问级别保持为超类来简化它。

答案 1 :(得分:2)

mMember中的

ChildChildClass继承自ParentClass,且可见性不会发生变化 - 因此它仍为protected

答案 2 :(得分:2)

它是protected,它是从父类继承的。

mMember ParentClass 中声明为受保护的修饰符。 ChildChildClass 扩展 ChildClass ,扩展 ParentClass 在ChildClass中没有更改访问修饰符,因此protected是ChildChildClass中的访问修饰符,它是从ParentClass继承的

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

除非您需要不受限制的访问权限,否则

为变量提供最严格的访问权限

修改

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

private int mMember;

将访问修饰符更改为私有后,ChildChildClass无法访问现在为私有的mMember。您将收到此错误: The filed ChildClass.mMember is not visible

答案 3 :(得分:2)

问题不明确。您只能在声明点设置可见性。在使用时,您可以看到变量。因此,您无法询问"访问变量时的可见性是什么?"但只有"我可以访问变量吗?"。对于您的情况,这意味着:ChildChildClassParentClass的(n间接)子项,mMember被声明为protected,因此它在ChildChildClass中可见。有关详细信息,请参阅the Oracle page about Access Modifiers