https://www.cnblogs.com/chenyangyao/p/5296807.html

关于对象的创建过程一般是从new指令(我说的是JVM的层面)开始的(具体请看图1),JVM首先对符号引用进行解析,如果找不到对应的符号引用,那么这个类还没有被加载,因此JVM便会进行类加载过程(具体加载过程可参见我的另一篇博文)。符号引用解析完毕之后,JVM会为对象在堆中分配内存,HotSpot虚拟机实现的JAVA对象包括三个部分:对象头、实例字段和对齐填充字段(具体内容请看图2),其中要注意的是,实例字段包括自身定义的和从父类继承下来的(即使父类的实例字段被子类覆盖或者被private修饰,都照样为其分配内存)。相信很多人在刚接触面向对象语言时,总把继承看成简单的“复制”,这其实是完全错误的。JAVA中的继承仅仅是类之间的一种逻辑关系(具体如何保存记录这种逻辑关系,则设计到Class文件格式的知识,具体请看我的另一篇博文),唯有创建对象时的实例字段,可以简单的看成“复制”。

为对象分配完堆内存之后,JVM会将该内存(除了对象头区域)进行零值初始化,这也就解释了为什么JAVA的属性字段无需显示初始化就可以被使用,而方法的局部变量却必须要显示初始化后才可以访问。最后,JVM会调用对象的构造函数,当然,调用顺序会一直上溯到Object类。

至此,一个对象就被创建完毕,此时,一般会有一个引用指向这个对象。在JAVA中,存在两种数据类型,一种就是诸如int、double等基本类型,另一种就是引用类型,比如类、接口、内部类、枚举类、数组类型的引用等。引用的实现方式一般有两种,具体请看图3。此处说一句题外话,经常用人拿C++中的引用和JAVA的引用作对比,其实他们两个只是“名称”一样,本质并没什么关系,C++中的引用只是给现存变量起了一个别名(引用变量只是一个符号引用而已,编译器并不会给引用分配新的内存),而JAVA中的引用变量却是真真正正的变量,具有自己的内存空间,只是不同的引用变量可以“指向”同一个对象而已。因此,如果要拿C++和JAVA引用对象的方式相对比,C++中的指针倒和JAVA中的引用如出一辙,毕竟,JAVA中的引用其实就是对指针的封装。

注:本文为原创博文,转载请注明出处。

图1  对象的创建过程

图2 对象的组成结构

图3  对象引用的两种实现方式

java new对象的创建过程相关推荐

  1. JAVA学习第五篇--java中对象的创建过程以及函数的调用过程

    下面本文将详细介绍java语言中对象的创建过程,以及函数的调用过程. class Person{public String name="zhao";public int ege;p ...

  2. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  3. Java对象的创建过程

    对象的创建过程: ①将class load到内存: ②申请内存: ③成员变量赋默认值: ④调用构造方法<init>,同时,成员变量顺序赋初始值,执行构造方法语句,会先调用父类的构造方法,有 ...

  4. java什么是对象如何创建对象_java对象的创建过程是什么

    java对象的创建过程: 类加载检查-->分配内存-->初始化零值-->设置对象头-->执行init方法 具体如下: 1.类加载检查 虚拟机遇到一条new指令时,先检查这个指令 ...

  5. java创建变量的过程_java 对象的创建过程

    初始化的顺序首先是static(如果它们尚未由前一次对象创建初始化,也就是new对象的时候,只执行一次static变量初始化),变量初始化顺序有变量在类的定义顺序决定的: 对象的创建过程,以Dog类为 ...

  6. Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  7. 从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的?

    转载自   从Java类到对象的创建过程都做了些啥?内存中的对象是啥样的? 先回顾一下Java程序执行的过程: Java程序执行时,第一步系统创建虚拟机进程,然后虚拟器用类加载器Class Loade ...

  8. java实例化类之后如何赋值_深入理解Java对象的创建过程:类的初始化与实例化...

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

  9. Java 面向对象与对象的创建过程及变量

    Java 面向对象与对象的创建过程及变量: 1.面向对象和面向过程的思想对比 : ​ 面向过程 :是一种以过程为中心的编程思想,实现功能的每一步,都是自己实现的 ​ 面向对象 :是一种以对象为中心的编 ...

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

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

最新文章

  1. 原来神经网络的损失函数也是网络的一部分
  2. SSM实现大学生综合素质评测系统
  3. [攻防世界 pwn]——hello_pwn
  4. java语音播报案例
  5. Silverlight反编译系列二常见代码(自动生成属性CompilerGenerated,代码)
  6. Leetcode--113. 路径总和Ⅱ
  7. 【html】【19】高级篇--大事件时间轴
  8. Onvif开发之代码框架生成篇
  9. 斩获VCR竞赛榜第一,腾讯微视推出BLENDer单模型,超越多模型最好效果
  10. AD域服务器中批量创建帐户
  11. 斯蒂夫·乔布斯《你必须要找到你所爱的东西》
  12. 计算机在智能交通应用,计算机信息技术在智能交通系统中的应用
  13. 从碧桂园和兴海物联看物业信息化、数字化和智能化
  14. AutoHotKey:Shift+ijkl实现方向键
  15. 手机浏览器找不到服务器,苹果手机的Safari浏览器找不到服务器怎么办?
  16. linux怎么将一个文件移动到另一个目录下
  17. length与length()的区别
  18. 来自帅气博主的c语言文案
  19. 自考计算机专业就业率,自考计算机专业就业前景和就业选择
  20. pptp连接服务器无响应,解决PPTP客户端拨号不成功

热门文章

  1. 安装Docker,配置阿里云加速和 docker-compose 国内镜像
  2. react-router 低版本的路由API
  3. Payload与form表单提交区别
  4. Git教程、python教程、ubuntu教程 收藏
  5. 使用Docker部署Gitlab
  6. VMware安装CentOS过程(初学linux)
  7. asp.mvc 基本知识
  8. 记一次失败的电话面试
  9. Lucene知识小总结8:索引查询
  10. 如何解决Configuration system failed to initialize