对象实列化

本文详细探讨了Java中对象实例化的内部机制,从字节码层面和执行步骤角度进行分析。在实例化过程中,JVM会进行类加载、内存分配、默认值初始化、对象头设置以及执行初始化方法等步骤。通过`javap`命令查看字节码,可以看到`NEW`、`DUP`和`INVOKESPECIAL`等指令在对象创建中的作用。
摘要由CSDN通过智能技术生成

对象实列化

java是面向对象的静态强类型语言, 声明并创建对象的代码很常见, 根据某个类声明一个引用变量指向被创建的对象, 并使用此引用变量操作该对象

那么在实列化对象的过程中, JVM中发生了什么化学反应呢?

(1) 下面从最简单的Object ref = new Object(), 代码进行分析, 利用javap-verbose-p命令查看对象创建的字节码如下:

stack=2,  locals=1,  args_size=0
      NEW  java/lang/Object
      DUP
      INVOKESPECIAL java/lang/Object.<init>()v
      ASTORE_1
      LocalVariableTable:
           Start     Length     Slot     Name     Signature
             8          1         0      ref       Ljava/lang/Object;

  • NEW: 如果找不到Class对象, 则进行类加载, 加载成功后, 则在堆中分配内存,从Object开始到本类路径上的所有属性值都要分配内存, 分配完毕之后, 进行零值初始化, 在分配过程中, 注意引用是占据存储空间的, 它是一个变量, 占用4个字节, 这个指令完毕后, 将指向实列对象的引用变量压入虚拟机栈顶
  • DUP: 在栈顶复制该引用变量, 这时的栈顶有两个指向堆内实列对象的引用变量, 如果(init)方法有参数, 还需要把参数压入操作栈中, 两个引用变量的目的不同, 其中压至底下的引用用于赋值, 或者保存到局部变量表, 另一个栈顶的引用变量作为句柄调用相关方法
  • INVOKESPECIAL: 调用对象实列方法, 通过栈顶的引用变量调用(init
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值