深入类加载器二----主动引用和被动引用

来源:互联网 发布:我与网络强国演讲稿 编辑:程序博客网 时间:2024/05/21 22:46

                 深入类加载器(二)--主动引用和被动引用

         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

 

 

 

0 0