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 ...
随机推荐
- LeetCode 第 338 题 (Counting Bits)
Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the ...
- IO流(8)递归删除带文件的目录
递归删除带内容的目录 * * 目录给定:demo * * 分析: * A:封装目录 * B:获取该目录下的所有文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D: ...
- 一个简单的servlet查询
首先创建一个dynamic web project. 写一个test.jsp: 新建一个servlet: 新建一个student.jsp: 显示如图:
- Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL
Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/c ...
- MyEclipse安装及破解步骤
MyEclipse2013 (32+64)下载地址(建议使用迅雷下载)http://downloads.myeclipseide.com/downloads/products/eworkbench/2 ...
- ubuntu 磁盘分区
1:查看分区情况:df -h admin@iZwz92c0zpe8t65qe996ckZ:/$ df -h Filesystem Size Used Avail Use% Mounted on ude ...
- PAT 1068 Find More Coins[dp][难]
1068 Find More Coins (30)(30 分) Eva loves to collect coins from all over the universe, including som ...
- rsync 配置详解
安装 [root@localhost ~]# yum install -y rsync [root@localhost ~]# systemctl start rsyncd [root@localho ...
- jmeter 读取excel数据
jmeter 读取excel数据使用的方法是使用Jmeter CSV Data Set Config参数化 但是将excel文件保存成csv格式后,jmeter读取后返回的数据总是出现乱码问题, 以下 ...
- ac1097
判断线段与直线的相交 这里有个地方需要注意的就是在 转换的时候容易报错 在叉积完后的判断符号的时候需要注意 这个地方会超出int 的范围 2014-06-0320:14:04 #include &l ...
(2)子类实例化过程中的内存分配
针对于上面的例子,分析一下内存分配