gpt4 book ai didi

java - 为什么嵌套的子类可以访问其父类的私有(private)成员,而孙子却不能?

转载 作者:IT老高 更新时间:2023-10-28 20:31:23 25 4
gpt4 key购买 nike

可能类似于问题,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);

相反,这不会在 T2T3 中编译:

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 field t1 and B would inherit from A and C from B, C could refer to As t1 by invoking super.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 的 T1T2T3 类名称)

如果 t1protected 就没有问题 - T3 可以直接引用 t1 字段就像任何子类一样。 private 会出现问题,因为一个类没有 awareness 其父类的 private 字段,因此不能直接引用它们,即使尽管在实践中它们是可见的。这就是为什么您必须使用 T2 中的 super.t1 才能引用相关字段。

尽管就 T3 而言,它没有 t1 字段,但它可以访问 T1s private 字段通过在同一个外部类中。既然是这种情况,您只需将 this 强制转换为 T1 ,您就有办法引用私有(private)字段。 T2 中的 super.t1 调用(本质上)将 this 转换为 T1 让我们引用它的字段。

关于java - 为什么嵌套的子类可以访问其父类的私有(private)成员,而孙子却不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38560436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com