在java中new一个对象的流程是什么?
Dog dog=new Dog()背后执行过程
这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点。
在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,首先我们写的类的代码被jvm编译为字节码文件,然后这个字节码文件被加载到内存中,这个过程涉及到加载,验证,准备,解析,初始化等五个步骤,具体来讲,Dog类的字节码文件包含了魔数,jdk的版本以及类的元数据,如常量池,字段表,方法表,属性表等,加载过程就是将这个字节码文件转换为二进制流放入jvm内存中方法区区域,并在堆中生成这个类的java.lang.class对象,作为访问这个类各种数据的入口,这里还涉及验证这个类是否满足jvm的规范以及是否威胁jvm安全,之后就是准备阶段,就是为静态变量分配内存并初始成类型的默认值,紧接着就是解析阶段,将符号引用也就是字节码中那些类和接口的全限定名替换成直接引用,即内存中的真正地址,然后就是初始化,赋值静态变量为指定值并执行静态方法,之后就是根据类的信息创建对象,包括为对象分配内存,主要是给本类和父类的实例变量分配,然后初始默认值,紧接着执行结构化代码赋予变量指定值,这个过程先初始父类再初始子类,最后就是会在栈中申请一块空间指向堆内存中的实例对象。
总之就是两个过程,类加载过程以及实例化过程,代码层面涉及到代码的执行顺序(父静态子静态//父构造代码块构造方法普通方法//子构造代码块构造方法普通方法),以及堆栈存储什么等知识点
在java中new一个对象的流程是什么?的更多相关文章
- Java 中的运算符和流程控制
Java 中的运算符和流程控制 + 面试题 算术运算符 Java 中的算术运算符,包括以下几种: **算术运算符** **名称** **举例** + 加法 1+2=3 - 减法 2-1=1 \* 乘法 ...
- jvm大局观之内存管理篇(二):当java中new一个对象,背后发生了什么
https://zhuanlan.zhihu.com/p/257863129?utm_source=ZHShareTargetIDMore 番茄番茄我是西瓜 那是我日夜思念深深爱着的人啊~ 已关注 ...
- java中new一个对象放在循环体里面与外面的区别
首先说下问题: 这次在做项目的是出现了一个new对象在循环里面与外面造成的不同影响. 大家可以看到这个new的对象放在不同的位置产生的效果是不一样的. 经过多方查询与验证可以得出结论: * EasyU ...
- 深入理解java中HelloWorld的执行流程
HelloWorld.java是我们学习java的第一个程序,简单的再也不能简单了,可是里面的原理以及执行流程大家都知道吗?最近在复习java知识,特地钻研了一番分享给大家! 贴出HelloWorld ...
- java中new一个对象的执行过程及类的加载顺序
1,new一个对象时代码的执行顺序 (1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的) 1.为父类的静态属性分配空间并赋于初值 1.执行父类静态初始化块; (2)加载子类 2.为子类 ...
- Java中把一个对象的值复制给另外一个对象引发的思考
Spring生态在Java项目中被广泛应用,从架构到技术应用再到常用的基本功能,Spring给我们的开发带来了很大的便利.今天翻到项目中导出报表功能的时候,发现经常复制对象的方法: BeanUtils ...
- java中new一个对象和对象=null有什么区别
原创:转载请注明出处 今天在写代码时,遇到一个问题,特此进行记录. for (ProfileDto profileDto : profile) { // Profile resP ...
- Java中动态代理工作流程
当谈到动态代理就会想到接口,因为接口是一种规范,动态代理对象通过接口便会很清楚地知道他的实现类(被代理对象)是何种类型的(即有哪些方法).Now,然我们来开始编写一个例子来了解动态代理的全过程: 第一 ...
- 当我们在Java中新建一个对象的时候发生了什么?
- 简单聊聊java中如何判定一个对象可回收
背景 说到java的特性,其中一个最重要的特性便是java通过new在堆中分配给对象的内存,不需要程序员主动去释放,而是由java虚拟机自动的回收.这也是java和C++的主要区别之一:那么虚拟机是如 ...
随机推荐
- oracle建表和sqlserver建表
oracle declare num number;begin select count(1) into num from user_all_tables where Upper(Table_Name ...
- HDFS、Ceph、GFS、GPFS、Swift、Lustre……容器云选择哪种分布式存储更好?
HDFS.Ceph.GFS.GPFS.Swift.Lustre--容器云选择哪种分布式存储更好?-51CTO.COM 容器云在使用分布式存储时,HDFS.CEPH.GFS.GPFS.Swift等分布式 ...
- Debug --> 使用USTC-TK2016工具对USTC-TFC2016数据集进行处理
文件介绍: https://blog.csdn.net/u010916338/article/details/86511009?spm=1001.2101.3001.6661.1&utm_me ...
- Oracle关联表进行修改操作(查询某个表,以某个表作为基础,修改其它表)
merge into tableA a using( SELECT a,b,c from tableB ) b on (a.id = b.id)//这里一定要用括号包起来.... when match ...
- 反序列化 sqlserver 中的 sysdiagrams,找到其中包含的表的信息
转载于:Script SQL Server 2005 diagrams to a file - CodeProject /** <summary> Based on ufn_Varbina ...
- 通过Windows定时任务执行Python脚本给钉钉群发送消息
前提:已经存在有成功发送钉钉群机器人消息的python脚本,参考上一篇Python调用钉钉群机器人发送群消息 Windows定时任务设置 1.本机是Win7系统:控制面板->系统和安全-> ...
- Python 时间日期获取(今天,昨天或者某一段时间)
日常使用的时间函数: 昨天,或者N天的日期 import time def time_stamp(days): hours = int(days) t = time.strftime("%Y ...
- MyBatis面试题汇总
1.什么是Mybatis? Mybatis是对象关系映射一个框架,它内部封装了JDBC,开发的时候只要关注SQL语句本身,可以严格控制sql的执行性能,灵活,其二可以通过XML或者注解来配置映射信息 ...
- Verilog中端口的连接规则
摘自于(15条消息) Verilog中端口应该设置为wire形还是reg形_CLL_caicai的博客-CSDN博客, 以及(15条消息) Verilog端口连接规则_「已注销」的博客-CSDN博客_ ...
- js 获取鼠标位置的两种方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...