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.所以当我说getA()
对class B
的对象所引用的时候b
它返回 5 。由于a
的实例变量class A
是私有的,因此class B
不会继承它。那么实例变量a
在哪里创建(在堆上)。如果它是public
它将成为Heap上class B
实例的一部分。此外class A
是一个abstarct类,因此无法实例化。
答案 0 :(得分:6)
实例变量的分配没有区别,无论它们是私有的,公共的,来自超类,来自抽象的超类
通常序列将类似于
B.class
对象Object
个实例变量的块(包括GC的辅助字段,同步监视器,......)A
个实例变量的块(在这种情况下仅a
)B
个实例变量的块(在本例中为none)然而,JVM的每个实现都可以自由选择如何分配它们
和访问控制由编译器和JVM强制执行
答案 1 :(得分:3)
变量'a'的实例将在类'B'的对象内的堆上创建。并且,它仍将在类'B'的对象内创建,其中实例'a'是公共的。
子类的OBJECT 必须包含其超类的私有字段。无法访问私人会员并不意味着它不存在。
正如JLS所述。
声明为private的类的成员不会继承 该类的子类。仅声明的类的成员 protected或public由包中声明的子类继承 除了宣布上课的那个。
子类不是超类的私有字段。子类的OBJECTS包含其超类的私有字段。子类本身没有其超类私有字段的NO OF。
答案 2 :(得分:0)
所有摘要都说“你不能自己创建这个类”。在类中定义的所有内容与非抽象类完全相同。
换句话说,删除上面的“abstract”关键字,结果编译的字节码看起来几乎相同。
它改变了你如何使用类,而不是类所包含的行为。
答案 3 :(得分:0)