JVM笔记 - 04数组的创建与反编译助记符

本文详细探讨了JVM中数组的创建过程,包括引用类型的一维、二维数组以及基本类型的数组。通过实例解析了数组在JVM中的类型表示,并介绍了与数组创建相关的字节码助记符`anewarray`和`newarray`,揭示了它们在内存中的操作机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


说明:笔记内容来源于《北京圣思园教育 - 张龙老师 - 深入理解JVM》视频课程。如有侵权,请联系删除。

1、内容回顾

所有的Java虚拟机实现,必须在每个类或接口被Java程序"首次主动使用"时,才初始化这个类或接口。

package com.test;

public class MyTest4 {

	public static void main(String[] args) {
		MyParent myParent = new MyParent();
		System.out.println("=============");
		MyParent myParent2 = new MyParent();
	}

}

class MyParent {
	static {
		System.out.println("MyParent static code");
	}
}

执行结果为:
​​​​在这里插入图片描述
结果解释:
MyParent类被首次主动使用时,才会被初始化;
创建myParent时,MyParent是首次主动使用,初始化时会执行静态代码块,
创建myParent2时,MyParent不是首次主动使用,不会再次初始化,所以静态代码块没有被执行。

2、引用类型的一维数组

package com.test;

public class MyTest4 {

	public static void main(String[] args) {
		//一维数组
		MyParent[] myParent = new MyParent[1];
		System.out.println("done");
	}

}

class MyParent {
	static {
		System.out.println("MyParent static code");
	}
}

执行结果为:
在这里插入图片描述
说明创建数组,不是对MyParent 的主动使用。
那myParent 的类型到底是什么呢?

package com.test;

public class MyTest4 {

	public static void main(String[] args) {
		//一维数组
		MyParent[] myParent = new MyParent[1];
		System.out.println(myParent.getClass());
		System.out.println(myParent.getClass().getSuperclass());
		System.out.println("done");
	}

}

class MyParent {
	static {
		System.out.println("MyParent static code");
	}
}

执行结果为:
在这里插入图片描述
myParent的类型为"[Lcom.test.MyParent",
"[Lcom.test.MyParent"的父类型为Object.

当创建一个数组类型的实例时,
并不表示对数组元素的主动使用,仅仅表示创建了一个数组实例。
数组实例的类型是JVM在运行期动态生成的,
对于数组来说,JavaDoc经常将构成数组的元素称为Component,实际上就是把数组降低一个维度后的类型。

3、引用类型的二维数组

引用类型的二维数组,也是类似的

package com.test;

public class MyTest4 {

	public static void main(String[] args) {
		//引用类型  一维数组
		MyParent[] myParent = new MyParent[1];
		System.out.println(myParent.getClass());
		System.out.println(myParent.getClass().getSuperclass());
		System.out.println();
		
		//引用类型  二维数组
		MyParent[][] myParent2 = new MyParent[1][1];
		System.out.println(myParent2.getClass());
		System.out.println(myParent2.getClass().getSuperclass());
		System.out.println("done");
	}

}

class MyParent {
	static {
		System.out.println("MyParent static code");
	}
}

执行结果为:
在这里插入图片描述

4、基本类型的数组

基本类型的数组,也是类似的

package com.test;

public class MyTest4 {

	public static void main(String[] args) {
		//基本类型
		boolean[] myParent1 = new boolean[1];
		System.out.println(myParent1.getClass());
		System.out.println(myParent1.getClass().getSuperclass());
		System.out.println();
		
		//基本类型
		byte[] myParent2 = new byte[1];
		System.out.println(myParent2.getClass());
		System.out.println(myParent2.getClass().getSuperclass());
		System.out.println();
		
		//基本类型
		char[] myParent3 = new char[1];
		System.out.println(myParent3.getClass());
		System.out.println(myParent3.getClass().getSuperclass());
		System.out.println();
		
		//基本类型
		short[] myParent4 = new short[1];
		System.out.println(myParent4.getClass());
		System.out.println(myParent4.getClass().getSuperclass());
		System.out.println();
		
		//基本类型
		int[] myParent5 = new int[1];
		System.out.println(myParent5.getClass());
		System.out.println(myParent5.getClass().getSuperclass());
		System.out.println("done");
	}

}

class MyParent {
	static {
		System.out.println("MyParent static code");
	}
}

执行结果为:
在这里插入图片描述

5、数组相关的助记符

5.1、anewarray

package com.test;

public class MyTest4 {

	public static void main(String[] args) {
		//引用类型
		MyParent[] myParent1 = new MyParent[1];
		System.out.println(myParent1.getClass());
		System.out.println(myParent1.getClass().getSuperclass());
		System.out.println();
	}
}

class MyParent {
	static {
		System.out.println("MyParent static code");
	}
}

反编译字节码
javap -c xx.class
在这里插入图片描述
助记符:anewarray
表示创建一个引用类型(比如 类、接口、数组)的数组,并把新创建数组的引用压入栈顶

5.2、newarray

package com.test;

public class MyTest4 {

	public static void main(String[] args) {
		//基本类型
		int[] myParent1 = new int[1];
		System.out.println(myParent1.getClass());
		System.out.println(myParent1.getClass().getSuperclass());
		System.out.println();
	}
}

class MyParent {
	static {
		System.out.println("MyParent static code");
	}
}

反编译字节码
javap -c xx.class
在这里插入图片描述
助记符:newarray
表示创建一个基本类型(比如 int、float、char等)的数组,并把新创建数组的引用压入栈顶

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值