- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
可能类似于问题,Why can outer Java classes access inner class private members?或 Access to superclass private fields using the super keyword in a subclass .
但有一些区别:子类可以访问其父类(并且只能访问最近的父类)的私有(private)成员。
给出下面的示例代码:
public class T {
private int t;
class T1 {
private int t1;
public void test() {
System.out.println(t);
}
}
class T2 extends T1 {
private int t2;
public void test() {
System.out.println(t);
System.out.println(super.t1);
System.out.println(this.t2);
}
}
class T3 extends T2 {
public void test() {
System.out.println(t);
System.out.println(super.t1); // NG: t1 Compile error! Why?
System.out.println(super.t2); // OK: t2 OK
}
}
}
最佳答案
聪明的例子!但这实际上是一个有点无聊的解释 - 不存在可见性问题,您根本无法直接从 T3
引用 t1
因为 super.super
isn't allowed .
T2
不能直接访问它自己的 t1
字段,因为它是私有(private)的(并且子类不继承其父类的私有(private)字段),但是 super
实际上是 T1
的一个实例,因为它在同一个类中,所以 T2
可以引用 super
的私有(private)字段。 T3
没有直接处理其祖父类 T1
的私有(private)字段的机制。
这两个都在 T3
内编译得很好,这表明 T3
可以访问其祖 parent 的 private
字段:
System.out.println(((T1)this).t1);
System.out.println(new T1().t1);
相反,这不会在 T2
或 T3
中编译:
System.out.println(t1);
如果 super.super
被允许,您将能够从 T3
执行此操作:
System.out.println(super.super.t1);
if I'd define 3 classes,
A
,B
,C
,A
having a protected fieldt1
andB
would inherit fromA
andC
fromB
,C
could refer toA
st1
by invokingsuper.t1
because it´s visible here. logically shouldn't the same apply to inner classes inheritance even if the field are private, because these private members should be visible due to being in the same class?
(为了简单起见,我将坚持使用 OP 的 T1
、T2
和 T3
类名称)
如果 t1
是 protected
就没有问题 - T3
可以直接引用 t1
字段就像任何子类一样。 private
会出现问题,因为一个类没有 awareness 其父类的 private
字段,因此不能直接引用它们,即使尽管在实践中它们是可见的。这就是为什么您必须使用 T2
中的 super.t1
才能引用相关字段。
尽管就 T3
而言,它没有 t1
字段,但它可以访问 T1
s private
字段通过在同一个外部类中。既然是这种情况,您只需将 this
强制转换为 T1
,您就有办法引用私有(private)字段。 T2
中的 super.t1
调用(本质上)将 this
转换为 T1
让我们引用它的字段。
关于java - 为什么嵌套的子类可以访问其父类的私有(private)成员,而孙子却不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38560436/
我需要索引 3 个级别(或更多)的子级-父级。例如,级别可能是一位作者、一本书和那本书中的角色。 但是,当索引超过两层时,has_child 和 has_parent 查询和过滤器会出现问题。如果我有
我制作了一个简单的 react 任务列表,它允许我添加新任务。我现在希望能够删除任务,但无法了解如何将函数属性传递给子/孙组件。 我想通过 deleteTaskFromState函数属性一直到 成分。
我正在循环属于 frag 的 span 元素类(class)。我想检测当前所在的frag元素是否是属于frag的a span元素的最小儿子/孙子/孙子(从左到右)类并属于 cond类,并且在其文本中有
在处理命令行的 JavaFX 模型时,我遇到了以下问题: 如果我运行一个运行另一个进程的进程(例如批处理文件)(例如使用简单的 start notepad 打开记事本)我似乎无法正确确定批处理文件何时
我正在 linux (Ubuntu) 上做一个小项目,我需要一个人通过身份验证才能访问服务。我的想法是,此身份验证应与进程及其子进程一起存储,而不是与 linux 用户本身一起存储。 此身份验证应通过
假设我有一个像这样的模板模态 react 组件(经过简化以使我的问题更清晰): function Modal(props) { const hide=()=>{ documen
过去 2 小时在网上搜索这个。任何帮助是极大的赞赏。 场景是这样的,我们有一个Questionnaire,有Steps,每个step都有input sets,每个input set有questions
我正在尝试解析编码不当的 XML 并输出标签的节点名称和内容(仅当它存在时),并且仅当字符串名称=内容 > 30 天时。 到目前为止,我可以使用 ElementTree 搜索子元素,但我需要有关嵌套信
我正在进行一个小实验。我正在尝试使用 :focus 创建一个没有 javascript 的 onclick 菜单。我遇到的问题是孙子,单击它仍然会关闭父级。我尝试使用 ~ 选择器使其保持打开状态,但它
我有一个 3 个数据库设置,例如父->子->孙,到目前为止,我可以设法获取特定父级的子级,但无法深入到另一个级别。 class Parent : Object { @objc dynamic
ver data = [ {"id": 1,"parent": 0,"name": "Parent"}, {"id": 2,"parent": 1,"name": "Child"},
我是一名优秀的程序员,十分优秀!