堆中创建的抽象类的私有实例变量在哪里?

Pan*_*kaj 6 java oop abstract-class abstract

abstract class A {
    private int a;
    public A(int x) {
        a = x;
    }
    public int getA() {
        return a;
    }
}

class B extends A {
    public B(int x) {
        super(x);
    }
}

class TestB {
    public static void main(String args[]) {
        B b = new B(5);
        System.out.println(b.getA());
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当我说B b=new B(5);超级构造函数被调用并且私有实例变量被初始化为5.所以当我说getA()on class B的对象被b它引用时返回5.作为实例变量aclass A是私人它不会被继承class B.那么在哪里a创建实例变量(在堆上).如果它是一个public它将成为class BHeap实例的一部分.也是class A一个abstarct类,因此无法实例化.

rat*_*eak 6

实例变量的分配无论是私有,公共,超类还是抽象超类都没有区别

通常序列将是类似的

  1. 引用该B.class对象
  2. Object实例变量块(包括GC的辅助字段,同步监视器,......)
  3. A实例变量块(仅a在这种情况下)
  4. B实例变量块(在本例中为none)

但是JVM的每个实现都可以自由选择如何分配它们

和访问控制由编译器和JVM强制执行