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

时间:2013-12-12 09:56:01

标签: 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());
    }
}

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

4 个答案:

答案 0 :(得分:6)

实例变量的分配没有区别,无论它们是私有的,公共的,来自超类,来自抽象的超类

通常序列将类似于

  1. B.class对象
  2. 的引用
  3. Object个实例变量的块(包括GC的辅助字段,同步监视器,......)
  4. A个实例变量的块(在这种情况下仅a
  5. B个实例变量的块(在本例中为none)
  6. 然而,JVM的每个实现都可以自由选择如何分配它们

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

答案 1 :(得分:3)

变量'a'的实例将在类'B'的对象内的堆上创建。并且,它仍将在类'B'的对象内创建,其中实例'a'是公共的。

子类的

OBJECT 必须包含其超类的私有字段。无法访问私人会员并不意味着它不存在。

正如JLS所述。

  

声明为private的类的成员不会继承   该类的子类。仅声明的类的成员   protected或public由包中声明的子类继承   除了宣布上课的那个。

子类不是超类的私有字段。子类的OBJECTS包含其超类的私有字段。子类本身没有其超类私有字段的NO OF。

答案 2 :(得分:0)

所有摘要都说“你不能自己创建这个类”。在类中定义的所有内容与非抽象类完全相同。

换句话说,删除上面的“abstract”关键字,结果编译的字节码看起来几乎相同。

它改变了你如何使用类,而不是类所包含的行为。

答案 3 :(得分:0)

继承的基本规则!!!

来自oracle documentation

  

子类不继承其父类的私有成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。