子类成员变量对另一个子类的可见性
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;
}
}
ChildChildClass
的 mMember
变量的 访问级别 是什么?是 public 还是 protected ?
ChildChildClass
中的 mMember
继承自 ParentClass
,并且可见性没有改变 - 因此它仍然是 protected
它是protected
,继承自父class。
mMember 在 ParentClass 中声明为受保护修饰符。 ChildChildClass 扩展了 ChildClass,后者扩展了 ParentClass。 ChildClass中的访问修饰符没有改变,因此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?"。对于您的情况,这意味着:ChildChildClass
是 ParentClass
的(n 个间接)子代并且 mMember
被声明为 protected
,因此它在 ChildChildClass
中可见。有关详细信息,请参阅 the Oracle page about Access Modifiers。
我是运行一个测试程序,想了解更多成员变量的可见性,我创建了以下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
变量的 访问级别 是什么?是 public 还是 protected ?
ChildChildClass
中的 mMember
继承自 ParentClass
,并且可见性没有改变 - 因此它仍然是 protected
它是protected
,继承自父class。
mMember 在 ParentClass 中声明为受保护修饰符。 ChildChildClass 扩展了 ChildClass,后者扩展了 ParentClass。 ChildClass中的访问修饰符没有改变,因此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?"。对于您的情况,这意味着:ChildChildClass
是 ParentClass
的(n 个间接)子代并且 mMember
被声明为 protected
,因此它在 ChildChildClass
中可见。有关详细信息,请参阅 the Oracle page about Access Modifiers。