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 ...
随机推荐
- linux命令之复制
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zkn_CS_DN_2013/article/details/24464547 语法:cp [选项] ...
- 014-Spring Boot web【三】拦截器HandlerInterceptor、异常处理页面,全局异常处理ControllerAdvice
一.拦截器HandlerInterceptor 1.1.HandlerInterceptor接口说明 preHandle,congtroller执行前,如果返回false请求终端 postHandle ...
- React Native开发之IDE(Atom+Nuclide)安装,运行,调试
版权声明:本文为博主原创文章,如需转载请注明出处 目录(?)[-] 前言 MacWindowsLinux 准备工作 安装Atom 安装Nuclide 新建一个工程 自动补全 类型标注 语法检查 跳 ...
- 字符串最长子串匹配-dp矩阵[转载]
转自:https://blog.csdn.net/zls986992484/article/details/69863710 题目描述:求最长公共子串,sea和eat.它们的最长公共子串为ea,长度为 ...
- Javascript--运算符判断成绩运算
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux printf
[root@LocalWeb01 ~]# printf '%s%s%s\n' 1 2 3 41234 [root@LocalWeb01 ~]# printf '%s%s%s' 1 2 3 41234 ...
- C#--virtual,abstract,override,new,sealed修饰符学习
1.参考博客 http://www.cnblogs.com/oneword/archive/2009/07/02/1515279.html http://www.cnblogs.com/mygood ...
- python之路 socket、socket server
一.socket socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意思.通常也 称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可 ...
- 76. Minimum Window Substring(hard 双指针)
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
- fafu 1411
想了好久都没想到怎么去判断当分类dp的时候大于或者等于要求的 值时应该怎么半 后来经过停了 qlx的想法 然后就 敲了出来 这题说的是 一个整数 分解成几个素数的和 按这个数的含有的最大素数 进行排 ...
(2)子类实例化过程中的内存分配
针对于上面的例子,分析一下内存分配