m0_65506053 2022-01-12 20:09 采纳率: 88.9%
浏览 33
已结题

在内存中创建对象时,是将子类和父类的属性所需空间全部分配好以后再给每个空间初始化,还是先给父类分配空间以后就初始化,再给子类分配空间然后对子类属性进行初始化?


public class ExtendsTheory {
    public static void main(String[] args) {
        Son son = new Son();
    }
}

class GrandPa { //爷类
    String name = "大头爷爷";
    String hobby = "旅游";
}

class Father extends GrandPa {//父类
    String name = "大头爸爸";
    private int age = 39;

    public int getAge() {
        return age;
    }
}

class Son extends Father { //子类
    String name = "大头儿子";
}

在段代码中创建son对象时,先依次加载object类,grandpa类,father类,son类的类信息以后,在堆中分配空间分别存储爷类,父类和子类的属性信息,在这个过程中是统一先将爷类,父类,子类属性所需的空间都分配好再统一对其进行初始化,还是先分配爷类属性的空间并对爷类属性进行初始化,再分配父类属性所需空间并初始化?

  • 写回答

3条回答 默认 最新

  • 小飞LOVE霞 2022-01-13 11:06
    关注

    首先“在内存中创建对象时,..........”,你提问的问题就有问题。具体是啥,且听我描述。
    1、首先对象的创建和加载不是同步进行的,具体对象的大小是由编译器决定,将具体值放在对象头中,在创建对象的时候使用,加载对象是由对象加载子系统进行加载的,加载到JVM的元空间(JDK8叫元空间,之前叫方法区)区域,一般情况下,加载是早于创建对象的。

    img

    2、答案是:由AppClassLoader对象先加载爷类、父类、孙子类。当你创建孙子类时,(Son son = new Son();),就会在JVM里面的堆内存中创建爷类对象并初始化,再创建父类对象并初始化,最后创建孙子类对象,并初始化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月12日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来