java中子类实例化过程中的内存分配
知识点:
子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢?
下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的
参考博客: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)值,这是内存如下:

结合内存分析,上面打印结果,就一目了然啦!
java中子类实例化过程中的内存分配的更多相关文章
- java继承子类实例化过程(细节解释)
		
1 package face_08; 2 class Fu{ 3 Fu(){ 4 super(); 5 show(); 6 return; 7 } 8 void show() { 9 System.o ...
 - 【Java】子类实例化过程
		
子类对象实例化的全过程 子类继承父类以后,就获取了父类中声明的属性或方法.创建子类的对象,在堆空间中,就会加载所有父类中声明的属性. 当我们通过子类的构造器创建子类对象时,我们一定会调用其父类的构造器 ...
 - Java中的成员初始化顺序和内存分配过程
		
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
 - 源码编译OpenJdk 8,Netbeans调试Java原子类在JVM中的实现(Ubuntu 16.04)
		
一.前言 前一阵子比较好奇,想看到底层(虚拟机.汇编)怎么实现的java 并发那块. volatile是在汇编里加了lock前缀,因为volatile可以通过查看JIT编译器的汇编代码来看. 但是原子 ...
 - Hive通过查询语句向表中插入数据过程中发现的坑
		
前言 近期在学习使用Hive(版本号0.13.1)的过程中,发现了一些坑,它们也许是Hive提倡的比关系数据库更加自由的体现(同一时候引来一些问题).也许是一些bug.总而言之,这些都须要使用Hive ...
 - 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
		
[VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...
 - Java中类,对象,方法的内存分配
		
Java中类,对象,方法的内存分配 以下针对引用数据类型: 在内存中,类是静态的概念,它存在于内存中的CodeSegment中. 当我们使用new关键字生成对象时,JVM根据类的代码,去堆内存中开辟一 ...
 - (转)Java new一个对象的过程中发生了什么
		
Java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名(包名+类名)来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该 ...
 - java new一个对象的过程中发生了什么?
		
java在new一个对象的时候,会先查看对象所属的类有没有被加载到内存,如果没有的话,就会先通过类的全限定名来加载.加载并初始化类完成后,再进行对象的创建工作. 我们先假设是第一次使用该类,这样的话n ...
 
随机推荐
- 启动spark
			
cd /app/sparkuser/spark-120/sbin ./start-all.sh #./stop-all.sh #停止服务 -------------------
 - 鼠标滑动到指定位置时div固定在头部
			
$(function(){ $(window).scroll(function () { if ($(window).scrollTop() > 253) { ...
 - Ubuntu Kylin 14.04 安装配置 jdk、eclipse、tomcat 通用
			
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qq1053781225/article/details/24810107 一.安装jdk ...
 - Tensorflow(一)
			
一.安装Ubantu环境 下载ios 网址:http://cn.ubuntu.com/download/ 2.配合虚拟机进行安装环境 虚拟机直接百度下载即可 虚拟机采用 3.配置 4.安装中 5.安装 ...
 - HTTP头部信息解释分析(详细整理)
			
这篇文章为大家介绍了HTTP头部信息,中英文对比分析,还是比较全面的,若大家在使用过程中遇到不了解的,可以适当参考下 HTTP 头部解释 1. Accept:告诉WEB服务器自己接受什么介质类型,*/ ...
 - zkSNARK 零知识验证
			
参考文献 ZCash7篇,有社区翻译版,但还是推荐看原汁原味的 https://z.cash/blog/snark-explain.html Vitalik3篇,小天才作者我就不介绍了,这三篇 ...
 - mysql 常用命令 常用SQL语句
			
维护命令 数据库 ##创建数据库 mysql> create database test; Query OK, 1 row affected ##删除数据库 mysql> drop dat ...
 - oracle 之创建用户,表空间,授权,修改用户密码
			
1.创建表空间 create tablespace ilinkcargoagent logging datafile 'D:\app\Administrator\oradata\ilinkcargoa ...
 - 机器学习理论基础学习9--- EM 算法
			
EM算法的适用场景: EM算法用于估计含有隐变量的概率模型参数的极大似然估计,或者极大后验概率估计. 当概率模型既含有观测值,又含有隐变量或潜在变量时,就可以使用EM算法来求解概率模型的参数. 当概率 ...
 - Python 进制转换、位运算
			
一.进制转换 编程用十进制,十进制转换为二进制.八进制.十六进制 In [135]: bin(23) Out[135]: '0b10111' In [136]: oct(23) Out[136]: ' ...
 
			
		
(2)子类实例化过程中的内存分配
针对于上面的例子,分析一下内存分配