【发布时间】:2016-05-22 19:27:47
【问题描述】:
我知道在 Java 中,只要超类提供公共或受保护的 getter 方法,您就可以在子类中访问超类的私有成员。然而,我也知道子类实际上并没有继承私有成员。考虑以下情况....
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();
}
}
我想了解,既然我们正在创建子类 B 的实例,那么该私有成员究竟是什么时候以及何时分配给内存的,它的范围是什么?既然 A 的实例实际上从未被创建,它是如何存在的?它不是静态变量,也不是最终变量,所以它是动态堆栈还是隐式堆动态?我认为,当您从超类实例化子类时,您也会继承非私有的成员和方法,然后将这些成员实例化为子类的对象实例的一部分(除非它们被覆盖等),所以只有一个对象被分配为堆动态变量。但是,如果这些私有成员没有被继承,那么编译器是否只是为它们提供堆栈动态引用以防调用继承的 getter 方法并且仅在这种情况下?
【问题讨论】:
标签: java class oop inheritance access-modifiers