我正在运行一个测试程序,以了解有关成员变量的更多信息。可见性,我创建了以下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
变量的访问级别是什么?是公开还是受保护?
答案 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)
问题不明确。您只能在声明点设置可见性。在使用时,您可以看到变量。因此,您无法询问"访问变量时的可见性是什么?"但只有"我可以访问变量吗?"。对于您的情况,这意味着:ChildChildClass
是ParentClass
的(n间接)子项,mMember
被声明为protected
,因此它在ChildChildClass
中可见。有关详细信息,请参阅the Oracle page about Access Modifiers。