1)类的主动引用(一定会发生类的初始化)
-new一个类的对象
-调用类的静态成员(除了finall)和静态方法
-使用Java.lang.reflect包的方法对类进行反射调用
-当虚拟机启动,Java Hello,则一定会初始化Hello类,就是先启动main方法所在的类
-当初始化一个类,如果父类没有被初始化,则一定会初始化他的父类
2)类的被动引用(不会发生类的初始化)
-当访问一个静态域时,只有真正声明这个域的类才会被初始化
*通过子类引用父类的静态常量,不会导致子类初始化
-通过数组定义类引用,不会触发此类的初始化
-引用常量不会触发此类的初始化(常量在编译阶段就存入调用类的常量池中了)
代码测试可以参考下面的代码
import jdk.dynalink.beans.StaticClass;
import java.sql.SQLOutput;
/**
* @author TR
* @date 2020/5/30 - 下午 5:31
*/
public class Demo2 {
public static void main(String[] args) {
//A q = new A();
//System.out.println(A.a);
System.out.println("主方法初始化");
A[] a=new A[10];
}
}
class A extends AA {
public static final int a = 100;
int b = 200;
static {
System.out.println("静态初始化类A");
}
public A() {
System.out.println("创建A类的对象");
}
}
class AA {
static String aa = "我是AA的常量";
static {
System.out.println("初始化父类AA");
}
}