类加载机制之初始化

2019-03-06  本文已影响0人  天草二十六_简村人

Java类加载分为5个过程,分别为:加载,连接(验证、准备、解析),初始化。

一、static变量的赋值在类的初始化中只会做一次。

public class TestSingleton {

    public static void main(String args[]) {
        SingletonTest singleton = SingletonTest.getSingleton();

        System.out.println("counter1=" + SingletonTest.counter1); ----1

        System.out.println("counter2=" + SingletonTest.counter2); ----0

    }
}

class SingletonTest {
    private static SingletonTest singleton = new SingletonTest();
    public static int counter1;
    public static int counter2 = 0; // 

    private SingletonTest() {
        counter1++;
        counter2++;
    }

    public static SingletonTest getSingleton() {
        return singleton;
    }
}

二、编译常量(static final)不会引起类的初始化,而运行常量会。
对比分析下面三类程序的运行结果,只有第一种是编译常量,后两种是运行常量。

public class TestClassLoader {

    public static void main(String[] args) {
        System.out.println(ClassLoaderTest.final_str);
    }
}

class ClassLoaderTest {
    static {
        System.out.println("init static block");
    }

    public static final String final_str = "abd";
}

上面运行结果是:
abd

public class TestClassLoader {

    public static void main(String[] args) {
       System.out.println(ClassLoaderTest.common_str);
    }
}

class ClassLoaderTest {
    static {
        System.out.println("init static block");
    }

    public static String common_str = "abd";

}

上面运行结果是:
init static block
abd

import java.util.Random;

public class TestClassLoader {

    public static void main(String[] args) {
        System.out.println(ClassLoaderTest.runtime_var);
    }
}

class ClassLoaderTest {
    static {
        System.out.println("init static block");
    }

    public static final int runtime_var = new Random().nextInt(100);
}

上面运行结果是:
init static block
40(随机数)

上一篇 下一篇

猜你喜欢

热点阅读