[英]Where is a private instance variable of an abstract class created in the heap?
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());
}
}
在这种情况下,当我说B b=new B(5);
调用超类构造函数并将私有实例变量初始化为5.因此,当我在class B
的对象上用b
表示getA()
,它返回5 。 由于class A
的实例变量a
是私有的,因此它不会被class B
继承。 那么实例变量a
在哪里创建(在堆上)。 如果它是一个public
,它将成为Heap上class B
实例的一部分。 class A
也是abstarct类,因此无法实例化。
实例变量的分配无论是私有,公共,超类还是抽象超类都没有区别
通常序列将是类似的
B.class
对象的引用 Object
实例变量块(包括GC的辅助字段,同步监视器,......) A
实例变量的块(在这种情况下只有a
) B
实例变量的块(在这种情况下没有) 但是,JVM的每个实现都可以自由选择如何分配它们
和访问控制由编译器和JVM强制执行
变量'a'的实例将在类'B'的对象内的堆上创建。 并且,它仍将在类'B'的对象内创建,其中实例'a'是公共的。
子类的OBJECT必须包含其超类的私有字段。 无法访问私人会员并不意味着它不存在。
正如JLS所述。
声明为private的类的成员不会被该类的子类继承。 只有声明为protected或public的类的成员才会被声明在声明类之外的包中声明的子类继承。
子类不是超类的私有字段。 子类的OBJECTS包含其超类的私有字段。 子类本身没有超类私有字段的NO OFTION。
所有摘要都说“你不能自己创建这个类”。 在类中定义的所有内容与非抽象类完全相同。
换句话说,删除上面的“abstract”关键字,得到的编译后的字节码看起来几乎相同。
它改变了你如何使用类,而不是类所包含的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.