一、概述
虽然类实例和数组都是对象,但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, 是因为此时并没指定第二维的大小,因此并没实际分配这一块的内存。