类的主动引用(一定会发生类的初始化)
1.当虚拟机启动,先初始化main方法所在的类
public class Text {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) {
}
}
2.当初始化一个类,如果其父类没有被初始化,则会先初始化它父类
public class Text {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) {
Son son = new Son();
}
}
class Father{
static {
System.out.println("父类被加载");
}
}
class Son extends Father{
static {
System.out.println("子类被加载");
}
}
3.调用类的静态成员(处final常量)和静态方法
public class Text {
static {
System.out.println("Main类被加载");
}
public static void text1(){
int a =0;
}
public static void main(String[] args) {
Text.text1();
}
}
4.使用java.lang.reflect包的方法对类进行反射调用
public class Text {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("cn.itasc.jiyi.Father");
}
}
class Father{
static {
System.out.println("父类被加载");
}
}
5.new一个类的对象
public class Text {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
Text s = new Text();
}
}
类的被动引用(不会发生类的初始化)
1.当访问一个静态域时,只有真正声明这个域的类才会被初始化。如:当通过子类引用父类的静态变量,不会导致子类初始化
2.通过数组定义类引用,不会触发此类的初始化
3引用常量不会触发此类的初始化(常量在链接阶段就存入调用类的常量池中了)
public class Text {
static {
System.out.println("Main类被加载");
}
public static void main(String[] args) throws ClassNotFoundException {
System.out.println(Son.a);
System.out.println("_____________________");
Son[] sons =new Son[5];
System.out.println("_____________________");
System.out.println(Son.h);
}
}
class Father{
static int a =1;
static {
System.out.println("父类被加载了");
}
}
class Son extends Father{
static {
System.out.println("子类被加载");
}
static final int h =2;
}