知识点:

子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢?

下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的

参考博客:http://www.cnblogs.com/xdp-gacl/p/3635948.html

(1)代码例子

//动物public class Animal{public String name;//名称 public int age;//年龄

 public Animal(){ this.age=100; System.out.println("动物无参构造函数!"); } //展示动物属性方法 public void showInfo(){this.name="动物名"; System.out.println("Animal.name:"+this.name); }

}
//人public class Person extends Animal {    public String name;//名称 public Person(){ System.out.println("人无参构造函数!"); }//展示(动物)人类属性方法 @Override public void showInfo(){ super.showInfo();//调用父类的方法,给Animal的name赋值并输出this.name="人名"; System.out.println("Animal.age:"+super.age);//输出父类的age值 System.out.println("Person.name:"+this.name);//输出Person实例的name值

 }}
//测试类public class Test {public static void main(String[] args) {       Person p=new Person(); p.showInfo(); }}运行结果:

(2)子类实例化过程中的内存分配

针对于上面的例子,分析一下内存分配执行main方法中的第一句:
Person p=new Person();先在栈(stack)空间中产生一个变量p,变量p里面存放的值是,Person类new的实例化对象的堆地址,通过这个值就可以找到堆中new对象的值,因为Person类是继承Animal父类的子类,所以在new Person对象时,这个对象里包含了Animal对象,Animal的name属性声明是没有初始化值,在程序编译时,会默认赋值null(String类型为null,int类型是0),Animal的age属性,在调用Person类的构造方法时,会先调用父类的无参构造函数,并给age赋值为100,同理Person类对象自己的属性name值为null,因此在执行Person p=new Person();之后,虚拟机中的内存分配如下:

执行第二句话
p.showInfo();

我们在new一个对象时,这个对象如果是继承一个父类,那么在堆中会产生一个this和一个super引用,this引用指向这个子类对象本身,super引用则指向子类包含的父类对象,如何没有继承父类,则仅仅只有this引用。当执行p.showInfo();时,进入Person类的showInfo()方法,开始会通过super引用,调用父对象的 showInfo();的方法,将父对象的name值变成“动物名”并打印,然后通过this引用调用子类自己的name属性并赋值“人名”,然后打印自己的name值,父对象的age(100)值,这是内存如下:

结合内存分析,上面打印结果,就一目了然啦!

转载于:https://www.cnblogs.com/shuaifing/p/10684485.html

java中子类实例化过程中的内存分配相关推荐

  1. java在程序运行过程中_Java内存管理-程序运行过程(一)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 勿在浮沙筑高台,出来混迟早要还的. 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine( ...

  2. Java实现CRM项目过程中的细节记录(一)

    CRM项目实现过程中的细节记录(一) 文章目录 CRM项目实现过程中的细节记录(一) 一.数据库相关细节 1. 表名 2. 表字段说明 3. 不使用主外键约束 4. 不使用主键自动增长 UUID 5. ...

  3. spring中容器启动过程中初始化资源使用方法

    一.定义 在业务场景中,有时需要我们在容器启动过程中加载资源,完成数据的初始化或者配置,需要在调用前加载进spring容器过程中去,有以下一些方法来实现 1.定义静态常量,随着类的生命周期加载而提前加 ...

  4. python中读取文件过程中seek()函数的使用

    python中读取文件过程中seek()函数的使用 目录 概述: 语法: 参数: 返回值: 实例: 概述: seek() 方法用于移动文件读取指针到指定位置. 语法: seek() 方法语法如下: 文 ...

  5. 在malloc函数中为什么常用sizeof来设定内存分配的大小?

    在malloc函数中为什么常用sizeof来设定内存分配的大小? 例子:为40个整数变量分配内存并赋值,然后系统在收回这些内存. #include<stdlib.h> #include&l ...

  6. 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明...

    [VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...

  7. SAP中物料质检过程中检验批/物料凭证/过账变更通知之间的业务关联图

    截图中通过三个SAP事务窗口展示了SAP中物料质检过程中检验批/物料凭证/过账变更通知之间的业务关联,分别从左到右是WM中的LU04过账变更通知,MM中的MB51物料由质检库存变成非限制库存产生的物料 ...

  8. java new一个对象的过程中发生了什么

    java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...

  9. Java实时多任务调度过程中的安全监控设计

    简介: 在一系列关联的多任务的实时环境中,如果有一个任务发生失败,可能导致所有任务产生连锁反应,从而造成调度失控的局面.特别是对于核心控制设备尤其重要,为了解决这个问题,必须对每个任务进行实时监控. ...

最新文章

  1. 【每日一题】航班预订统计
  2. Keras版Sequence2Sequence对对联实战——自然语言处理技术
  3. c语言解析xml字符串_Python XML解析和处理(三十二)
  4. 【Linux】一步一步学Linux——unalias命令(206)
  5. Microsoft JET Database Engine 错误 #39;80004005#39;的解决方法
  6. Jmeter简单的登录压力测试(使用json发送post请求)
  7. 天津大学计算机考试题库,天津大学在线考试题库及答案[开放英语专]
  8. 【软件工程】滨江学院 李振宏 软件工程 考点整理
  9. 整人VBS\BAT代码 ② 整蛊系列→可参考
  10. linux信号灯超时时间已到,急!!信号灯超时时间已到错误又出来了!!!!
  11. 海康人脸服务器型号,DS-2CD7A27FWD/F-LZ(S) 海康人脸识别摄像机 海康200万像素深眸智能人脸日夜筒型网络摄像机...
  12. 设置gvim中横竖光标_VIM的配置:高亮光标所在的行列
  13. 数据库设计 - 01外卖配送系统
  14. 关于互联网公司,说几句个人感触
  15. 极客日报:贾跃亭回应是否有回国打算:那必须的;顺丰将拿出 2 亿元给快递员加薪;OpenAI 宣布解散机器人团队
  16. java检查html是否闭合,Java Html解析器和闭合标记
  17. 基于物联网的室内环境检测云系统设计(树莓派RPI、Arduino、智能家居、RFID、APP)
  18. css3+jquery仿win7开机效果
  19. war项目连接linux数据库,springboot项目war包部署到Linux
  20. 这只线虫不简单!大脑被高精度还原,可动态蠕动前行

热门文章

  1. WINDOWS系统自动登录设置
  2. 斩断亏损,让利润奔跑
  3. 《浪潮之巅》吴军:特斯拉自动驾驶堪比中甲水平,全球5G看好华为
  4. 硅谷华人创业公司Trifo获1100万美元融资,将发布智能扫地机器人
  5. 2018年,AI会在金融行业哪些方向上发力?
  6. “现有人工智能都是二流的”
  7. bzoj 4129 Haruna’s Breakfast 树上莫队
  8. 特斯拉要用太阳能满足整座岛全年能源需求
  9. Ubuntu源码安装Nginx
  10. 【云计算】Kubernetes、Marathon等框架需要解决什么样的问题?