java ClassLoader static

 

package init;

class Person {

    private static Person person = new Person(); public static int count2 = 5; public static int count1;

    private Person() {
        count1++;
        count2++;
    }

    public static Person getInstance()
    {
        return person;
    }

}

public class Testsingleton {
    public static void main(String[] args) {
        System.out.println("count1: " + Person.count1);
        System.out.println("count2: " + Person.count2);
    }

}

 


Output:
count1: 1
count2: 5

缘由:
ClassLoader java

类在执行以前会执行三个步骤:优化

1.类的加载:查找并加载类的二进制数据,把对应的class文件加载到内存spa

2.链接code

     2.1. 验证:确保被加载的类的正确性(主要防止恶心的class文件被加载)blog

     2.2. 准备:为类的静态变量分配内存,并将其初始化为默认值接口

     2.3. 解析:把类中的符合引用转换为直接引用内存

3.初始化:为类的静态变量赋予正确的初始值get

 

发现其中步骤2.2和3提到了关键字静态变量,重点关注这两步,2.2的结果会致使为静态变量编译器

person,count1,count2分配内存并赋值(默认值)虚拟机

person=null;

count1=count2=0

 

到步骤3,初始化时会为静态变量赋予正确的值,那么何时才会进行初始化呢?

     全部的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化 

java对类的使用方式分为:主动使用,被动使用

主动使用有六种:(除这6种外,其余都是被动使用)

一、建立类的实例
二、访问某个类或接口的静态变量或对该静态变量赋值
三、调用类的静态方法
四、反射
五、初始化类的子类
六、java虚拟机启动时被标注位启动类的类

即在执行main方法时会为静态变量赋值,若是有多个静态变量,按照自上而下的顺序(编译器会优化,与代码书写的顺序会不一致)
为person变量初始化时后count1=1;count2=1;

public static int count2 = 5;执行后,count2=5

验证:

package init;

class Person {

    public static int count2 = 5; private static Person person = new Person(); public static int count1;

    private Person() {
        count1++;
        count2++;
    }

    public static Person getInstance()
    {
        return person;
    }

}

public class Testsingleton {
    public static void main(String[] args) {
        System.out.println("count1: " + Person.count1);
        System.out.println("count2: " + Person.count2);
    }

}

Output:
count1: 1
count2: 6

http://longpo.iteye.com/blog/2217113

相关文章
相关标签/搜索