Java 通过受保护访问私有超类成员 getter

Java accessing private superclass member through protected getter

我知道在Java中你可以在subclass中访问superclass的私有成员,只要superclass提供一个public 或受保护的 getter 方法。但是我也知道 subclass 实际上并没有继承私有成员。考虑以下情况....

Class A {
    private var = 2;
    protected int getVar(){
        return var;
    }
}

Class B extends A{

   public void printVar(){
       System.out.println(getVar());
   }
}

Class Main{

    public static void main(args []){

         B b= new B();
         b.printVar();
    }
}

我想知道,因为我们正在创建子class B 的实例,所以那个私有成员究竟是什么以及什么时候分配给内存的,它的范围是什么?由于实际上从未创建过 A 的实例,它是如何存在的呢?它不是静态变量,也不是最终变量,所以它是堆栈动态的还是隐式堆动态的?我认为,当您从超级 class 实例化一个子 class 时,您继承了非私有成员和方法,然后将它们实例化为子 [= 的对象实例的一部分18=](除非它们被覆盖等),因此只有一个对象分配为堆动态变量。但是,如果这些私有成员没有被继承,那么编译器是否只是在调用继承的 getter 方法的情况下简单地提供对它们的堆栈动态引用,并且仅在这种情况下?

您认为超class 的私有成员不被子class 继承的假设是错误的。所有成员都是继承的。 sub-class的私有成员是sub-class实例的一部分,但是sub-class的代码不能直接访问它们。

在 super-class 中有一个受保护的 getter,returns 私有成员的值为 sub-class 提供了访问值的方法私有成员(虽然它不能修改它,除非你在 super-class 中也有一个 protected 或 public setter)。

I also know however that the subclass does not actually inherit the private member.

是的。 B 的实例是 A 的实例,它包含所有相同的字段。您无法再直接访问私有字段,但它们仍然存在。

How does it even exist since an instance of A was actually never created?

当您创建 B 时,也会调用 A 中的构造函数,以确保 B 实例被正确初始化为有效的 A。不要将子类视为与其超类不同的东西。 B 仍然是 A;它只是做得更多。