ClassLoader详解,更新1 /java

仔细下面这段简单的代码,会输出什么?

package core.java;
class SingleTon{
    private static SingleTon instance = new SingleTon();
    public static int num1;
    public static int num2 = 0;
    
    private SingleTon(){
        num1++;
        num2++;
    }
    
    public static SingleTon getInstance(){
        return instance;
    }
}

public class ClassLoaderTest {
    public static void main(String[] args) {
        SingleTon single = SingleTon.getInstance();
        System.out.println("num1: "+single.num1);
        System.out.println("num1: "+single.num2);
    }
}

 

 

运行一下:

这里涉及到类的加载和初始化过程:

1、类在被主动调用时,触发类的加载,jvm查找并加载类的二进制数据到内存

2、jvm检查class文件的正确性,因为防止恶意手动生成的class文件

3、为类的静态变量分配内存,并初始化默认值。

这一步是关键,此处的初始化默认值并非赋值,比如此时 instance  的值是null,num1是0,num2是0。而此时num2的0 不是‘=’赋值的0

4、把类的符号引用转换为直接引用。即:把引用变成指针,这是java中的指针,java在应用开发过程中是没有指针的,但是jvm里是有的。

5、初始化

  a) instance = new SingleTon () 调用构造方法,num1 和num2 的值被赋值为1

  b) num1用户没有给默认值,维持1;

  c) num2用户给了默认值0,将0赋给了num2;

 

 

(未完待续)

更新1:2018-01-01,举个例子

 

posted @ 2018-01-01 23:31  他随意独奏  阅读(151)  评论(0编辑  收藏  举报