加载机制系列
类加载机制(一)
类加载机制(二)
类加载机制(三)
类的加载全过程中的主动引用与被动引用
类的主动引用(会初始化)
- new 一个类的对象
- 调用类的静态成员(除了final修饰的常量)和静态方法
- 使用java.lang.reflect包的反射调用
- 虚拟机启动main方法所在的类
- 当调用一个类时候,如果其父类没有被初始化则先初始化其父类
类的被动引用(不会初始化)
- 当访问一个静态域时,只有真正生命这个域的类才会被初始化,如:通过子类引用父类的静态变量时候,不会导致子类初始化
- 通过数组定义类引用 不会被初始化
- 引用常量不会触发此类的初始化 (常量在编译阶段已存入调用该类的常量池中了)
Demo
public class Demo01 {
static {
System.out.println("静态初始化类Demo01");
}
public static void main(String[] args) {
System.out.println("Demo01的main() 方法");
A a = new A();
System.out.println(A.width);
}
}
class A_Father {
public static int father_width=10;
public final static int father_final_test=333;
static {
System.out.println("静态初始化类A_father");
}
}
class A extends A_Father {
public static int width = 100;
static {
System.out.println("静态初始化类A");
width = 300;
}
public A() {
System.out.println("创建A对象");
}
}
结果:
先初始化A的父类 A_Father
静态初始化类Demo01
Demo01的main() 方法
静态初始化类A_father
静态初始化类A
创建A对象
300
修改main方法
public static void main(String[] args) {
// System.out.println("Demo01的main() 方法");
// A a = new A();
//调用A的静态域
System.out.println(A.width);
}
结果:A类被加载初始化
静态初始化类Demo01
静态初始化类A_father
静态初始化类A
300
再次修改直接用反射调用
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//调用A的静态域
//System.out.println(A.width);
//反射调用
Class.forName("com.org.test.init.A");
}
结果:A类被加载初始化
静态初始化类Demo01
静态初始化类A_father
静态初始化类A
调用常量:
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//调用A的静态域
//System.out.println(A.width);
//反射调用
//Class.forName("com.org.test.init.A");
//调用常量
System.out.println(A_Father.father_final_test);
}
结果:类没有加载初始化
静态初始化类Demo01
333
调用父类静态域
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//调用A的静态域
//System.out.println(A.width);
//反射调用
//Class.forName("com.org.test.init.A");
//调用常量
//System.out.println(A_Father.father_final_test);
//调用父类静态变量
System.out.println(A_Father.father_width);
}
结果:只有父类被加载初始化
静态初始化类Demo01
静态初始化类A_father
10
数组引用:
public static void main(String[] args) throws Exception{
// System.out.println("Demo01的main() 方法");
// A a = new A();
//调用A的静态域
//System.out.println(A.width);
//反射调用
//Class.forName("com.org.test.init.A");
//调用常量
//System.out.println(A_Father.father_final_test);
//调用父类静态变量
//System.out.println(A_Father.father_width);
//数组变量引用
A[] as= new A[10];
}
结果:类不会被加载
静态初始化类Demo01
网友评论