Dog dog=new Dog()背后执行过程

这个涉及到字节码文件结构,类加载机制,堆,栈的认识等知识点。

在执行new的时候可以大致分为二个过程,初始化以及实例化,初始化就是类的加载过程,首先我们写的类的代码被jvm编译为字节码文件,然后这个字节码文件被加载到内存中,这个过程涉及到加载,验证,准备,解析,初始化等五个步骤,具体来讲,Dog类的字节码文件包含了魔数,jdk的版本以及类的元数据,如常量池,字段表,方法表,属性表等,加载过程就是将这个字节码文件转换为二进制流放入jvm内存中方法区区域,并在堆中生成这个类的java.lang.class对象,作为访问这个类各种数据的入口,这里还涉及验证这个类是否满足jvm的规范以及是否威胁jvm安全,之后就是准备阶段,就是为静态变量分配内存并初始成类型的默认值,紧接着就是解析阶段,将符号引用也就是字节码中那些类和接口的全限定名替换成直接引用,即内存中的真正地址,然后就是初始化,赋值静态变量为指定值并执行静态方法,之后就是根据类的信息创建对象,包括为对象分配内存,主要是给本类和父类的实例变量分配,然后初始默认值,紧接着执行结构化代码赋予变量指定值,这个过程先初始父类再初始子类,最后就是会在栈中申请一块空间指向堆内存中的实例对象。

总之就是两个过程,类加载过程以及实例化过程,代码层面涉及到代码的执行顺序(父静态子静态//父构造代码块构造方法普通方法//子构造代码块构造方法普通方法),以及堆栈存储什么等知识点

在java中new一个对象的流程是什么?的更多相关文章

  1. Java 中的运算符和流程控制

    Java 中的运算符和流程控制 + 面试题 算术运算符 Java 中的算术运算符,包括以下几种: **算术运算符** **名称** **举例** + 加法 1+2=3 - 减法 2-1=1 \* 乘法 ...

  2. jvm大局观之内存管理篇(二):当java中new一个对象,背后发生了什么

    https://zhuanlan.zhihu.com/p/257863129?utm_source=ZHShareTargetIDMore 番茄番茄我是西瓜 那是我日夜思念深深爱着的人啊~ 已关注   ...

  3. java中new一个对象放在循环体里面与外面的区别

    首先说下问题: 这次在做项目的是出现了一个new对象在循环里面与外面造成的不同影响. 大家可以看到这个new的对象放在不同的位置产生的效果是不一样的. 经过多方查询与验证可以得出结论: * EasyU ...

  4. 深入理解java中HelloWorld的执行流程

    HelloWorld.java是我们学习java的第一个程序,简单的再也不能简单了,可是里面的原理以及执行流程大家都知道吗?最近在复习java知识,特地钻研了一番分享给大家! 贴出HelloWorld ...

  5. java中new一个对象的执行过程及类的加载顺序

    1,new一个对象时代码的执行顺序 (1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的) 1.为父类的静态属性分配空间并赋于初值 1.执行父类静态初始化块; (2)加载子类 2.为子类 ...

  6. Java中把一个对象的值复制给另外一个对象引发的思考

    Spring生态在Java项目中被广泛应用,从架构到技术应用再到常用的基本功能,Spring给我们的开发带来了很大的便利.今天翻到项目中导出报表功能的时候,发现经常复制对象的方法: BeanUtils ...

  7. java中new一个对象和对象=null有什么区别

    原创:转载请注明出处 今天在写代码时,遇到一个问题,特此进行记录. for (ProfileDto profileDto : profile)            { // Profile resP ...

  8. Java中动态代理工作流程

    当谈到动态代理就会想到接口,因为接口是一种规范,动态代理对象通过接口便会很清楚地知道他的实现类(被代理对象)是何种类型的(即有哪些方法).Now,然我们来开始编写一个例子来了解动态代理的全过程: 第一 ...

  9. 当我们在Java中新建一个对象的时候发生了什么?

  10. 简单聊聊java中如何判定一个对象可回收

    背景 说到java的特性,其中一个最重要的特性便是java通过new在堆中分配给对象的内存,不需要程序员主动去释放,而是由java虚拟机自动的回收.这也是java和C++的主要区别之一:那么虚拟机是如 ...

随机推荐

  1. 23 Django--Q的使用

    方式1: models.xx.objects.filter(Q(id=10)) models.xx.objects.filter(Q(id=10)&Q(age=10) # and models ...

  2. Python基础数据类型-String(字符串)

    print("===========字符串类型常见方法=============") a = "stringing" print(a.capitalize()) ...

  3. ffmpeg编译错误/libfdk-aacenc.c: In function 'aac_encode_init'

    ffmpeg编译错误/libfdk-aacenc.c: In function 'aac_encode_init' 需要手动打一个补丁 https://git.libav.org/?p=libav.g ...

  4. scala之函数式编程

    1.面相对象编程和函数式编程 2.函数和方法的区别 scala可以在任何的语法结构中声明任何的语法: scala中函数可以嵌套定义: scala中如果main内部的函数 和 main外部的函数名称.参 ...

  5. Java基础Day5-数组

    一.数组声明创建 首先必须声明数组变量,才能在程序中使用数组. 声明数组变量的语法如下: dataType[] arrayRefVar; 例如: int[] nums; Java语言使用new操作符来 ...

  6. 需要改动node_modules,并且别人也可以同步,插件 patch-package

    patch-package 转自:https://www.cnblogs.com/lovewhatIlove/p/15724812.html 1.简介:有个功能需要修改node_modules里面的代 ...

  7. Alibaba Cloud Linux 3.2104 64位安装mysql5.6.45

    1 .安装cmake wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz tar -zxvf cmake-2.8.10.2.tar.g ...

  8. 数字子串的和 str2int

    UVA1673 这道题可以用广义后缀自动机,不过陈锋老师给我们讲了一个巧妙地方法,使得这道题可以用普通的后缀自动机做. 题目大意: 给出NNN个完全由数字组成的字符串.计算将这个NNN的字符串的所有子 ...

  9. OSIDP-I/O管理和磁盘调度-11

    I/O设备 I/O设备分类:人可读.机器可读和远程通信三类. I/O设备之间的差别: 1.数据传送速率 2.应用领域 3.控制的复杂性 4.传送单位 5.数据表示形式 6.错误条件 I/O功能的组织 ...

  10. 【原创】windows环境下Java串口编程

    由于工作中遇到需要读取SBG Ellipse N系列的惯导模块数据,为了方便操作,我选择在Windows下进行串口开发.串口使用RS232. Ellipse-N RS232的引脚定义 开始我尝试使用的 ...