深入类加载器(二)--主动引用和被动引用
JVM类加载的全过程值之初始化的时机,类的主动引用和被动引用,静态初始化块执行顺序问题。
我们已经知道了类加载的初始化阶段就是类构造器的初始化。所谓的类构造器就是
将静态变量的初始化动作和静态块中的所有的内容合并起来。在静态变量和静态块的初始化过程
在多线程的环境中肯定是线程安全的。肯定会有同步和等待。并且如果发现父类还没有进行初始化的时候,那么就先初始化父类。这是要注意的。
package com.lg.test;
public class Demo01 {
static {
System.out.println("静态初始化Demo01");
}
public static void main(String[] args){
System.out.println("Demo01中的main方法");
ADemo a=new ADemo();
System.out.println(a.width);
ADemo a2=new ADemo();
}
}
class ADemo extends ADemo_Father{
public static int width=300;
static{
System.out.println("静态初始化类A");
width=100;
}
public ADemo(){
System.out.println("创建A类的对象");
}
}
class ADemo_Father{
static{
System.out.println("静态初始化A_Father");
}
}
运行的结果如下:
静态初始化Demo01
Demo01中的main方法
静态初始化A_Father
静态初始化类A
创建A类的对象
100
创建A类的对象
从这个的输出我们可以看到:这个过程是先加载了Demo01,并且初始化了static块域。然后执行到main方法中的内容。
然后输出一句话。接着,发现要用到A类了。在这里我们可以看到类只有在使用的时候才会被加载。但是又发现ADemo类的父类
还没有被加载,于是开始加载ADemo类的父类,并且进行初始化。接着进行加载和初始化ADemo类。如果我们在new 一个
ADemo 的对象,我们发现,类初始化的过程没有执行了。这就说明了,类只有在使用的时候才会被加载,并且只会被
加载和初始化一次。这是要注意的。
接下来我们要聊的就是类的主动引用和被动引用。
主动引用的时候,类会被初始化。
被动引用的时候,类不会被初始化。
package com.lg.test;
public class Demo01 {
static {
System.out.println("静态初始化Demo01");
}
public static void main(String[] args) throws ClassNotFoundException{
//主动引用,类会被初始化
//1 创建一个对象
//new ADemo();
//2 引用一个域的时候
//System.out.println(ADemo.width);
//3 通过反射调用的时候
//Class.forName("com.lg.test.ADemo");
//4 main方法所在的类
//当虚拟机启动的时候,说白了就是main方法中的类一定会被初始化。
//被动引用,类不会被初始化
//这个static变量被final修饰的时候。这样的话,就从常量池直接取过来使用了
//System.out.println(ADemo.MAX);
//通过数组来引用的时候
//ADemo[] array=new ADemo[2];
//只有真正声明这个域的类才会被初始化
// System.out.println(BDemo.width);
}
}
class BDemo extends ADemo{
static{
System.out.println("静态初始化BDemo");
}
}
class ADemo extends ADemo_Father{
public static final int MAX=100;
public static int width=300;
static{
System.out.println("静态初始化类A");
width=100;
}
public ADemo(){
System.out.println("创建A类的对象");
}
}
class ADemo_Father{
static{
System.out.println("静态初始化A_Father");
}
}
从上往下的执行的结果如下:
1.
静态初始化Demo01
静态初始化A_Father
静态初始化类A
创建A类的对象
2.
静态初始化Demo01
静态初始化A_Father
静态初始化类A
100
3
静态初始化Demo01
静态初始化A_Father
静态初始化类A
4
静态初始化Demo01
5
静态初始化Demo01
100
6
静态初始化Demo01
7
静态初始化Demo01
静态初始化A_Father
静态初始化类A
100