image.png
image.png
/**
* @author NingXioaoming
* @createTime 2019/12/11 16:09
* @description
*/
/*
对于静态字段来说,只有只有直接定义了该字段的类才会被初始化
JVM参数:
-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); //由于静态字段 str定义在MyParent1中所以只有MyParent1才被初始化了
System.out.println(MyChild1.str2); //由于初始化一个类的时候,他的父类也会被初始化,所以MyParent1和MyChild1都被初始化了
}
}
class MyParent1{
public static String str = "Helle world";
static {
System.out.println("MyParent1 static block");
}
}
class MyChild1 extends MyParent1{
public static String str2 = "Helle world welcome";
static {
System.out.println("MyChild1 static block");
}
}
例子2
/**
* @author NingXioaoming
* @createTime 2019/12/11 16:38
* @description
*/
/*
常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中,
本质上,调用类并没有直接引用到定义常量的类,因此并不会触发
定义常量的类的初始化
注意:这里指的是将常量(str)存放到了MyTest2的常量池中,之后MyTest2
与MyParent2没有任何关系了 , 甚至可以将MyParent2的.class文件删除掉
常量:被final修饰的变量
*/
/*
助记符:
ldc表示将int,float或是String类型的常量值从常量池中推送至栈顶。
bipush:表示将单字节(-128 - 127)的常量值推送至栈顶
sipush:表示将一个短整型常量值(-32768 - 32767)推送至栈顶
iconst_1:表示将int类型1推送至栈顶(iconst_1 - iconst_5)
*/
public class MyTest2 {
public static void main(String[] args) {
System.out.println(MyParent2.str);
}
}
class MyParent2{
public static final String str = "Helle world";
public static final short sho = 127;
public static final int i = 128;
static {
System.out.println("MyParent1 static block");
}
}