在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++的主要区别之一:那么虚拟机是如 ...
随机推荐
- pytest与allure的使用
--需要先安装pytest [1]数据驱动@pytest.mark.parametrize: @pytest.mark.parametrize只对于同一用例不同数据的传参 ①只有一个参数时 datat ...
- pandas的groupby.apply和直接apply效果是不一样的
GroupBy.apply(func, *args, **kwargs)[source] Apply function func group-wise and combine the results ...
- 类内函数的override问题-方法
Question: have a base class with a virtual function: class Base { public: virtual void Function(); } ...
- Bugku Log4j2 漏洞题目 解题参考
Log4j2 漏洞题目 题目地址 https://ctf.bugku.com/challenges/detail/id/340.html?page=1 二.攻击环境准备 需要一台linux云服务器,把 ...
- MySQL核心知识
MySQL常用的命令 启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库 ...
- 12.15linux学习第十八天
今天老刘讲了如同天书一般的隐藏章节,第23章使用OpenLDAP部署目录服务,难度太高了.第16章使用Squid部署代理缓存服务 章节概述: 本章首先介绍代理服务的原理以及作用,然后介绍Squid服务 ...
- centos6放行防火墙8080端口操作
1. 进入防火墙文件: [ vi /etc/sysconfig/iptables ] 2. 放行8080端口: [ -A RH-Firewall-1-INPUT -m state --state NE ...
- maven工程入门
1. 为什么要使用maven? 毕业开始工作,项目组用的maven-spring开发的,不得不了解一下,看过很多介绍,其中maven最大的特点就是 管理jar包和版本管理 (参考:https://ww ...
- 微信小程序地理定位和城市选择列表
1.先获取用户是否授权地理定位,如果没有让其跳转到设置页面手动开启(获取到的位置是经纬度,需要借助其他地图SDK的地址逆解析获取省市区的名字) getSetting() { wx.getSetting ...
- Git_基础理论
三个区域 Git本地有三个工作区域:工作目录(Working Directory).暂存区(Stage/Index).资源库(Repository或Git Directory).如果在加上远程的git ...