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
;它只是做得更多。
我知道在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
;它只是做得更多。