类的初始化
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"); } }

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号