JVM_字节码指令2_创建指令

一、概述

虽然类实例和数组都是对象,但Java虚拟机对类实例数组的创建与操作使用了不同字节码指令

1.创建类实例的指令:new

·它接收一个操作数,为指向常量池索引,表示要创建的类型执行完成后,将对象的引用压入栈

2.创建数组的指令:newarray/ anewarray/ multianewarry

newarray:  创建基本类型数组
·anewarray:创建引用类型数组
multianewarray:创建多维数组
上述创建指令可以用于创建对象或者数组,由于对象和数组在ava中的广泛使用,这些指令的使用频率也非常高

二、例子

1. 创建类的实例对象

    //创建指令
    private void newInstance(){
       Object obj = new Object();

       File file = new File("TestFile");
    }

则字节码指令为:

 0 new #11 <java/lang/Object>
 3 dup
 4 invokespecial #1 <java/lang/Object.<init>>
 7 astore_1
 8 new #12 <java/io/File>
11 dup
12 ldc #13 <TestFile>
14 invokespecial #14 <java/io/File.<init>>
17 astore_2
18 return

其中,dup 表示把 操作数栈顶的元素 复制一份, 并压入栈顶。  作用是为了传给后面的 init初始化 操作。 (对操作数栈中的元素操作)

初始化完后,再把操作数栈中的对象引用 保存在局部变量表中。

2.创建数组

    private void newArray(){
        int[] intArray = new int[10];
        Object[] objectArray = new Object[10];
        int[][] mintArray = new int[10][10];

        String[][] strArray = new String[10][];
    }

(1)对应的 intArray变量这一行 字节码指令为:

 0 bipush 10
 2 newarray 10 (int)
 4 astore_1

(2) 对应objectArrary 这一行的字节码指令为:
 5 bipush 10
 7 anewarray #11 <java/lang/Object>
10 astore_2

(3) 对应objectArrary 这一行的字节码指令为:
11 bipush 10
13 bipush 10
15 multianewarray #15 <[[I> dim 2
19 astore_3

(4) 对应objectArrary 这一行的字节码指令为:
20 bipush 10
22 anewarray #16 <[Ljava/lang/String;>
25 astore 4
27 return

注意(4) 的时候,还是使用 anewarray,   是因为此时并没指定第二维的大小,因此并没实际分配这一块的内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值