/**
* 关于类的被动使用,即不会进行类的初始化操作,即不会调用<clinit>()
* <p>
* 1.当访问一个静态字段时,只有真正声明这个字段的类才会被初始化。
* - 当通过子类引用父类的静态变量,不会导致子类初始化
* 2.通过数组定义类引用,不会触发此类的初始化
*
* 说明:没有初始化的类,不意味着没有加载!
*/
public class PassiveUse1 {
@Test
public void test1() {
System.out.println(Child.num);
}
@Test
public void test2() {
Parent[] parents = new Parent[10];
}
}
class Parent {
static {
System.out.println("Parent的初始化过程");
}
public static int num = 1;
}
class Child extends Parent {
static {
System.out.println("Child的初始化过程");
}
}
/**
* 3.引用常量不会触发此类或接口的初始化。因为常量在链接阶段就已经被显示赋值了。
* 4.调用ClassLoader类的loadClass()方法加载一个类,并不是对类的主动使用,不会导致类的初始化。
*/
public class PassiveUse2 {
@Test
public void test1(){
System.out.println(Person.NUM);
}
@Test
public void test2(){
// System.out.println(SerialA.ID);
System.out.println(SerialA.ID1);
}
@Test
public void test3(){
try {
Class clazz = ClassLoader.getSystemClassLoader().loadClass("com.young.springbootdemo.jvm.Person");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Person{
static {
System.out.println("Person类的初始化");
}
public static final int NUM = 1;//在链接过程的准备环节就被赋值为1了
public static final int NUM1 = new Random().nextInt(10);
}
interface SerialA{
public static final Thread t = new Thread() {
{
System.out.println("SerialA的初始化");
}
};
int ID = 1;
int ID1 = new Random().nextInt(10);//此时的赋值操作需要在<clinit>()中执行
}
梦想很模糊,去追,它会渐变清晰。青春励志,奋斗下去别放弃。
网友评论