繁体   English   中英

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

[英]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类,因此无法实例化。

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

通常序列将是类似的

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

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

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

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

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

正如JLS所述。

声明为private的类的成员不会被该类的子类继承。 只有声明为protected或public的类的成员才会被声明在声明类之外的包中声明的子类继承。

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

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

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

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

基本的继承规则!!!

来自oracle文档

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM