1.导致类初始化的原因:
-
运行主方法所在的类,需要先完成类的初始化,再执行main方法。
public class Main { static { System.out.println("Main.static initializer"); } public static void main(String[] args) { System.out.println("Main.main"); } }
-
第一次使用某个类的时候会进行初始化,第二次再进行new的时候就不会进行初始化。
class User { static { System.out.println("User.static initializer User初始化完毕"); } } public class Test2 { public static void main(String[] args) { new User(); new User(); new User(); } }
-
调用某个类的静态成员(类变量和类方法 ----> 被static修饰的变量或者方法),如果此时类没有初始化则先做类的初始化再进行实例的初始化。
class User { static { System.out.println("User.static initializer"); } public static int a = 10; public static void test1() { System.out.println("User.test1"); } } public class Test2 { public static void main(String[] args) { int a = User.a; System.out.println("a = " + a); User.test1(); } }
-
子类初始化的时候,发现父类没初始化的时候先初始化父类。
public class Test2 { public static void main(String[] args) { Zi zi = new Zi(); } } class Fu { static { System.out.println("Fu.static initializer"); } } class Zi extends Fu { static { System.out.println("Zi.static initializer"); } }
-
通过反射操作某个类时,如果这个类没有初始化,也会倒置该类先初始化。
public class Test2 { public static void main(String[] args) throws Exception { Class<?> aClass = Class.forName("cn.lele.Fu"); Class<?> aClass2 = Class.forName("cn.lele.Fu"); Class<?> aClass3 = Class.forName("cn.lele.Fu"); } } class Fu { static { System.out.println("Fu.static initializer"); } }
2.哪些使用类的操作不会导致类的初始化?
-
使用某个类的静态常量 (static final)
public class Test2 { public static void main(String[] args) throws Exception { System.out.println(Fu.MAX); } } class Fu { public static final int MAX = 999; static { System.out.println("Fu.static initializer"); } }
-
通过子类调用父类的静态变量,静态方法,只会倒置父类的初始化,不会导致子类的初始化。即只有声明静态成员的类才会初始化。
public class Test2 { public static void main(String[] args) throws Exception { Zi.test1(); } } class Fu { public static int a = 10; public static void test1(){ System.out.println("Fu.test1"); } public static final int MAX = 999; static { System.out.println("Fu.static initializer"); } } class Zi extends Fu { static { System.out.println("Zi.static initializer"); } }
-
用某个类型声明数组并创建数组对象时,不会导致这个类初始化
public class Test2 { public static void main(String[] args) throws Exception { Zi[] zis = new Zi[10]; System.out.println(zis.length); } } class Zi { static { System.out.println("Zi.static initializer"); } }
标签:初始化,System,class,static,public,out From: https://www.cnblogs.com/beishanqingyun/p/17080763.html