对于静态字段来说,只有直接定义了该字段的类才会被初始化;
当某个类在初始化时,要求其父类全部都已经初始化完毕了
-XX:+TraceClassLoading,用于追踪类的加载信息并打印出来
-XX:+<option>, 表示开启option选项
-XX:-<option>, 表示关闭option选项
-XX:<option>=<value>, 表示将option选项的值设置为value
public class MyTest1 {
public static void main(String[] args) {
//System.out.println(MyChild1.str);
System.out.println(MyChild1.str2);
}
}
class MyParent1{
public static String str = "hello world";
static {
System.out.println("MyParent1 static block");
}
}
class MyChild1 extends MyParent1{
public static String str2 = "welcome";
static {
System.out.println("Child1 static block");
}
}
在编译阶段,常量会被存入调用这个常量的那个方法所在的类的常量池中.
本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量类的初始化
注意:这里指的是将常量存放到了MyTest2的常量池中, 之后MyTest2与MyParent2就没有任何关系了
甚至可以将MyParent2的class文件删除.
如上: 常量str会存入到上面类MyTest2中常量池中
助记符:
ldc表示将int, float或是String类型的常量值从常量池中推送至栈顶
bipush表示将单字节(-128 - 127)的常量值推送至栈顶
sipush表示将一个短整形常量值(-32768 - 32767)推送至栈顶
iconst_1表示将int类型数字1推送至栈顶(iconst_m1 - iconst_5) -1到5
public class MyTest2 {
public static void main(String[] args) {
System.out.println(MyParent2.d);
System.out.println(MyParent2.ss);
System.out.println(MyParent2.sa);
}
}
查看反编译
E:\gitSpace\jdk8\out\production\classes>javap -c jvm.classloader.MyTest2
class MyParent2{
public static String str = "hello world";
public static final int s = -1;
public static final int ss = 128;
public static final int sa = 127;
public static final int d = 6;
static {
System.out.println("MyParent2 static block");
}
}
对于数组实例来说,其类型是由JVM运行期动态生成的,表示为class [Ljvm.classloader.MyParent4
这种形式,动态生成的类型,其父类就是Object
对于数组来说,JavaDoc经常将构成数组的元素为Component,实际上就是将数组降低一个维度后来的类型.
助记符:
anewarray: 表示创建一个引用类型的(如类,接口,数组)数组,并将其引用压入栈顶
newarray: 表示创建一个指定的原始类型(如int, float, char等)的数组,并将其引用值压入栈顶
public class MyTest4 {
public static void main(String[] args) {
//MyParent4 myParent4 = new MyParent4();
MyParent4[] arr = new MyParent4[1];
System.out.println(arr.getClass()); //class [Ljvm.classloader.MyParent4
MyParent4[][] arr2 = new MyParent4[1][1];
System.out.println(arr2.getClass()); //class [[Ljvm.classloader.MyParent4;
System.out.println(arr.getClass().getSuperclass()); //class java.lang.Object
System.out.println(arr2.getClass().getSuperclass()); //class java.lang.Object
System.out.println("===================");
int[] ints = new int[1];
System.out.println(ints.getClass()); //class [I
System.out.println(ints.getClass().getSuperclass()); //class java.lang.Object
char[] chars = new char[1];
System.out.println(chars.getClass()); //class [C
boolean[] booleans = new boolean[1];
System.out.println(booleans.getClass()); //class [Z
byte[] bytes = new byte[1];
System.out.println(bytes.getClass()); //class [B
}
}
class MyParent4 {
static {
System.out.println("MyParent4 static block");
}
}
网友评论