说明:笔记内容来源于《北京圣思园教育 - 张龙老师 - 深入理解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等)的数组,并把新创建数组的引用压入栈顶