JAVA虚拟机:对象的创建过程
简要说明的话,Java对象的创建过程分为下面几步:
1、执行相关检查;
2、为对象分配内存,将分配到的内存空间都初始化为零值;
3、进行构造代码块和构造函数的初始化
下面详细介绍这几个步骤:
1、执行相关检查
虚拟机遇到一条new指令时,将会去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和初试化过,如果没有,那必须先执行相应的类加载过程;
例:Person p = new Person()
当有这么一条new指令时,我们先去检查p这个符号引用是否能在常量池中定位到,然后检查Person这个类是否已经被加载、解析和初始化,没有则执行相关的操作;static代码块就是在这一加载过程中被执行;
2、为对象分配内存
类加载检查完后,将为新生对象分配内存;
将分配到的内存空间都初始化为零值;
如果Person类有继承父类,在这一步分配内存会分配Person类和其父类的内存,并先完成Person父类对象的创建
3、进行构造代码块和构造函数的初始化
上一步完成了内存空间的初始化后,接着进行构造代码块和构造函数的初始化
看下面的例子再理解一下对象创建的过程
public class test extends Person{
static {
System.out.println("子类static代码块");
}
{
System.out.println("子类构造代码块");
}
public test() {
System.out.println("子类构造方法");
}
public static void main(String[] args) {
test t = new test();
}
}
class Person{
static{
System.out.println("父类static代码块");
}
{
System.out.println("父类构造代码块");
}
Person(){
System.out.println("父类构造方法");
}
}
父类static代码块
子类static代码块
父类构造代码块
父类构造方法
子类构造代码块
子类构造方法
从结果可以看出:
1、static代码块是最先执行,子类和父类的static代码块都是在类加载的过程中就执行的;
2、父类对象的创建在子类对象之前完成,所以父类的构造代码块和构造方法先执行,执行完后再执行子类的;
3、构造代码块是在构造函数之前执行的,其实整个对象的加载顺序是:父类和子类的static代码块、父类中的变量、代码块、构造方法,然后再初始化子类变量、代码块、构造方法。其中变量最先初始化创建,其次是代码块,构造方法最后创建;
JAVA虚拟机:对象的创建过程的更多相关文章
- 深入理解java虚拟机---对象的创建过程(八)
1.对象的创建过程 由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程. 注意: 最后一步的init方法是代码块和构造方法. 以上是总图,下 ...
- java中对象的创建过程
public class Test1 { public static void main(String[] args) { new B(); System.out.println("---- ...
- 【Java】对象的创建过程
一.对象的创建过程 1.首次创建对象时或该类静态方法/静态域首次被访问时,JAVA解释器查找该类的路径,定位该类的class文件 2.载入该类的class文件,有关静态初始化的所有动作执行,但是只执行 ...
- Java虚拟机-对象的创建和访问
一.对象的创建: 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程. 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启 ...
- HotSpot虚拟机对象的创建过程
1.文中讨论的对象限于普通Java对象,不包括数组和class对象. 2.内存的分配方式由Java堆是否规整来决定,而Java堆是否规整取决于垃圾收集器是否有压缩整理的功能. 3.还需要考虑:对象的创 ...
- 图解JAVA对象的创建过程
前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...
- 2 Java对象的创建过程
JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢? 程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢? 一 对象创建的步骤 1 遇到new指令时,检查这个指令的参数是 ...
- 深入理解Java对象的创建过程:类的初始化与实例化
摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...
- (转)深入理解Java对象的创建过程
参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...
随机推荐
- 第三章 JavaScript操作BOM对象
第三章 JavaScript操作BOM对象 一.window对象 浏览器对象模型(BOM)是javascript的组成之一,它提供了独立与浏览器窗口进行交换的对象,使用浏览器对象模型可以实现与HT ...
- 关于团购VPS的事情报告
作者 玄魂 2017-08-11 玄魂工作室-玄魂 玄魂工作室首先要抱歉,之前的说的继续组织大家购买vps的事情,不会再组织了.原因有以下几个:1)因为人多,需求各不相同,不好协调.2)服务都是购 ...
- Python-函数-Day4
1.函数 1.1.集合 主要作用: 去重 关系测试, 交集\差集\并集\反向(对称)差集 a = {1,2,3,4} b ={3,4,5,6} a {1, 2, 3, 4} type(a) <c ...
- api-gateway实践(10)新服务网关 - OpenID Connect
网关指南: https://help.aliyun.com/document_detail/29487.html?spm=5176.doc48835.6.550.23Oqbl 网关控制台: https ...
- 推荐几个IDEA插件,Java开发者撸码利器。
这里只是推荐一下好用的插件,具体的使用方法不一一详细介绍. JRebel for IntelliJ 一款热部署插件,只要不是修改了项目的配置文件,用它都可以实现热部署.收费的,破解比较麻烦.不过功能确 ...
- Bellman-Ford算法的改进---SPFA算法
传送门: Dijkstra Bellman-Ford SPFA Floyd 1.算法思想 Bellman-Ford算法时间复杂度比较高,在于Bellman-Ford需要递推n次,每次递推需要扫描所有的 ...
- 什么是web框架
什么是web框架 web应用框架是支持动态网站.网络应用程序的软件框架. web框架的工作方式:接收http请求并处理,分派代码, 产生html,创建http响应. web框架 通常包含了:url路由 ...
- ECSHOP模板 蘑菇街2018广告楼层设置说明
楼层广告以及说明 图1 ------------------ 设置,通过,后台,模板设置,分类下的商品,选用需要显示的商品分类 图2------------------ 后台,编辑商品分类的广告链接. ...
- SQL外连接
1.左外连接 取出左侧关系中所有与右侧关系中任一元组都不匹配的元组,用空值null充填所有来自右侧关系的属性,构成新的元组,将其加入自然连接的结果中 2.右外连接 取出右侧关系中所有与左侧关系中任一元 ...
- MySQL高可用架构之MHA 原理与实践
MHA简介 关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到mas ...