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(随机数)












网友评论