注意,这里说的是“类的初始化”,但这并不意味着它不会去加载这个类,这个是不确定的(可能加载,也可能不加载)。能确定的是“被动使用”不会导致“初始化”的产生。
/**
* -XX:+TraceClassLoading
*/
public class MyTest1 {
public static void main(String[] args) {
System.out.println(MyChild1.str);
}
}
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("MyChild1 static block");
}
}
结果:
MyParent1 static block
hello world
“MyChild1”的“静态代码块”没有执行,说明“MyChild1”没有被初始化!!
对于静态字段来说,只有直接定义了该字段的类才会被初始化。
谁定义了这个“静态变量”,就表示对谁的“主动使用”
Q:我们知道“MyChild1”没有被初始化,但是它有没有被“加载”了??
A:“MyChild1”类有被加载。


结果:
MyParent1 static block
MyChild1 static block
welcome
当一个类在初始化时,要求其父类全部都已经初始化完毕了。所以’Object’类会是第一个被初始化的。
注意,这里是“父类全部”而不是“全部父类”。因为Java是单继承的,每个Java类只会有一个父类,而父类又可以有它的父类。。。而且每一个父类(即,这个类)只会被初始化一次。
/**
* -XX:+TraceClassLoading
*/
public class MyArrayTest {
public static void main(String[] args) {
SuperClass[] sca = new SuperClass[10];
sca[0] = new SuperClass();
}
}
class SuperClass {
static {
System.out.println("SuperClass init!");
}
}
结果:
<空>
运行之后发现没有输出“SuperClass init!”,说明并没有触发类com.bayern.shengsiyuan.jvm_lecture.lesson1.linling.SuperClass的初始化阶段。但是这段代码里面触发了另外一个名为“[Lcom.bayern.shengsiyuan.jvm_lecture.lesson1.linling.SuperClass”的类的初始化阶段,对于用户代码来说,这并不是一个合法的类名称,它是一个由虚拟机在运行期自动生成的(这有点像动态代理,动态代理的类就是虚拟机在运行期在执行过程当中帮助我们生成出来的)、直接继承于java.lang.Object的子类,创建动作由字节码指令anewarray触发。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-80669-2.html
美国看不下去了
没人希望战争
希望抓住机会
放着好日子不好好过