
这个类代表了一个元素类型为com.bayern.shengsiyuan.jvm_lecture.lesson1.linling.SuperClass的一维数组,数组中应有的属性和方法(用户可直接使用的只有被修饰为public的length属性和clone()方法)都实现在这个类里。Java语言中对数组的访问比C/C++相对安全是因为这个类封装了数组元素的访问方法,而C/C++直接翻译为对数组指针的移动。(准确地说,越界检查不是封装在数组元素访问的类中,而是封装在数组访问的xaload、xastore字节码指令中)

可以看到SuperClass虽然没有被初始化,但是它被加载了。c 类 static 函数
而且,数组类本身不通过类加载器创建,它是由Java虚拟机直接创建的。所以也看不到名为“[Lcom.bayern.shengsiyuan.jvm_lecture.lesson1.linling.SuperClass”类的加载日志信息。
原生数据类型对应的数组类型:
比如,『int[] ints = new int[10];』int数组的类型为‘[I’ 
表示‘创建数组’的助记符
[1]『MyParent4[] myParent4s = new MyParent4[1]』对应的字节码文件代码:
“anewarray”:表示创建一个引用类型的(如类、接口、数组)数组,并将其引用值压入栈顶
[2]『int[] ints = new int[1]』对应的字节码代码:
“newarray”:表示创建一个指定的原始类型(如int、float、char等)的数组,并将其引用值压入栈顶
/**
* -XX:+TraceClassLoading
*/
public class MyTest2 {
public static void main(String[] args) {
System.out.println(MyParent2.str);
}
}
class MyParent2 {
public static final String str = "hello world";
static {
System.out.println("MyParent2 static block");
}
}
结果:
hello world
final本身表示的是一个常量,它是不能被改变的。因此在编译阶段,这个常量就会被存入到,调用这个常量的那个方法所在的类的常量池当中。
常量在编译阶段会存入到调用这个常量的方法所在类的常量池中,本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量类的初始化。
同时,通过“-XX:+TraceClassLoading”打印被类加载器加载的类信息,发现MyParent2类没有被加载!!
我们来看看这个类的字节码:
指令:javap -c com.bayern.shengsiyuan.jvm_lecture.lesson1.MyTest2

下面对“ldc”助记符以及某些常见助记符进行介绍:
助记符:
“ldc”:表示将int、float或是String类型的常量值从常量池中推送至栈顶
『short s = 7』对应助记符“bipush”
“bipush”:表示将单字节(-128 ~ 127)的常量值推送至栈顶
注意,这是说的是“单字节”,并没有限制你是什么类型。如,int a = 6;反编译后也会是’bipush’的。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-80669-3.html
卧槽amber变帅好多