简要说明的话,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虚拟机:对象的创建过程的更多相关文章

  1. 深入理解java虚拟机---对象的创建过程(八)

    1.对象的创建过程 由于类的加载是一个很复杂的过程,所以这里暂时略过,后面会详细讲解,默认为是已加载过的类.着重强调对象的创建过程. 注意: 最后一步的init方法是代码块和构造方法. 以上是总图,下 ...

  2. java中对象的创建过程

    public class Test1 { public static void main(String[] args) { new B(); System.out.println("---- ...

  3. 【Java】对象的创建过程

    一.对象的创建过程 1.首次创建对象时或该类静态方法/静态域首次被访问时,JAVA解释器查找该类的路径,定位该类的class文件 2.载入该类的class文件,有关静态初始化的所有动作执行,但是只执行 ...

  4. Java虚拟机-对象的创建和访问

    一.对象的创建: 创建对象在java上面是很简单的,使用new关键字就可以了,但是其实在虚拟机中,java对象的创建是一个复杂的过程. 当java虚拟机遇到一个new的指令的时候,对象创建的程序正式启 ...

  5. HotSpot虚拟机对象的创建过程

    1.文中讨论的对象限于普通Java对象,不包括数组和class对象. 2.内存的分配方式由Java堆是否规整来决定,而Java堆是否规整取决于垃圾收集器是否有压缩整理的功能. 3.还需要考虑:对象的创 ...

  6. 图解JAVA对象的创建过程

    前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能 ...

  7. 2 Java对象的创建过程

    JAVA中创建对象直接new创建一个对象,对么对象的创建过程是怎样的呢? 程序运行过程中有许多的对象被创建出来.那么对象是如何创建的呢? 一 对象创建的步骤 1 遇到new指令时,检查这个指令的参数是 ...

  8. 深入理解Java对象的创建过程:类的初始化与实例化

    摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...

  9. (转)深入理解Java对象的创建过程

    参考来源:http://blog.csdn.net/justloveyou_/article/details/72466416 摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一 ...

随机推荐

  1. 爬虫小探-Python3 urllib.request获取页面数据

    使用Python3 urllib.request中的Requests()和urlopen()方法获取页面源码,并用re正则进行正则匹配查找需要的数据. #forex.py#coding:utf-8 ' ...

  2. 你能选择出,前几个元素吗?使用纯css

    面试被问到 ,你能选择出前几个元素吗?括弧只能使用css 我当时是一脸懵逼... 回去的路上思考一路 终于想到了解决办法 虽然为时已晚 但是觉得很有意义... 首先要用到 否定选择器 : :not() ...

  3. Linux下的Shell编程(2)环境变量和局部变量

    Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型. 局部变量在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量.这些变量与环境变量不 ...

  4. redis数据库各种数据类型的增删改查命令

    redis的常用数据操作: redis是key-value的数据结构,每条数据都是一个键值对. 键的类型是字符串并且键不能重复. redis最基本数据类型是string 所以下面的操作可以省略引号&q ...

  5. centos6.5中rpm包安装mysql5.7(初始化出错如何解决)

    下载rpm包见:http://www.cnblogs.com/grey-wolf/p/7472680.html 1.rz上传到服务器,解压缩 rz [root@mini2 upload]# -.el6 ...

  6. 生成git私钥

    在git已经安装的情况下,输入命令: 一.设置git的user name和email git config —(此处两个横杠)global user.name “XXX” git config —(此 ...

  7. UI前端开发都是做什么的以及html、css、php、js等究竟是神马关系

    第一个问题: 1.UI,是视觉方面的呈现.一个网页首先由UI完成整体设计,然后把每一个模块切图,例如组件.logo.版块等.常用工具:PS,AI,DW. 2.前端,是将UI的设计代码化,因为计算机无法 ...

  8. 3分钟搞掂Set集合

    前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单[源码剖析] Map集合.散列表.红黑树介绍 HashMap就是这么简单[源码剖析] LinkedH ...

  9. JAVA如何实现深拷贝

    protected 域(或方法)微妙的规则 protected 域(或方法)对本包内的所有类可见(当然包括子类),那么,子类可以获得访超类受保护域(或方法)的权利,但是,若子类和超类不在同一个包下,就 ...

  10. win10安装Ubuntu14.04双系统

    1 制作镜像 UltralISO刻录镜像到U盘,下载地址:http://pan.baidu.com/s/1o7JpthS 2压缩空间给Ubuntu安装 使用windows自带的压缩(磁盘管理) 3安装 ...