类的初始化

1.导致类初始化的原因:

  1. 运行主方法所在的类,需要先完成类的初始化,再执行main方法。

    image-20230131195348681

     public class Main {
    
         static {
             System.out.println("Main.static initializer");
         }
    
         public static void main(String[] args) {
             System.out.println("Main.main");
         }
    
     }
    
  2. 第一次使用某个类的时候会进行初始化,第二次再进行new的时候就不会进行初始化。

    image-20230131195732088

     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();
         }
     }
    
  3. 调用某个类的静态成员(类变量和类方法 ----> 被static修饰的变量或者方法),如果此时类没有初始化则先做类的初始化再进行实例的初始化。

    image-20230131200242461

     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();
         }
     }
    
  4. 子类初始化的时候,发现父类没初始化的时候先初始化父类。

    image-20230131200526152

     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");
         }
     }
    
  5. 通过反射操作某个类时,如果这个类没有初始化,也会倒置该类先初始化。

    image-20230131200741644

     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.哪些使用类的操作不会导致类的初始化?

  1. 使用某个类的静态常量 (static final)

    image-20230131204520415

     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");
         }
     }
    
  2. 通过子类调用父类的静态变量,静态方法,只会倒置父类的初始化,不会导致子类的初始化。即只有声明静态成员的类才会初始化。

    image-20230131204953144

     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");
         }
    
     }
    
  3. 用某个类型声明数组并创建数组对象时,不会导致这个类初始化

    image-20230131205247702

     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");
         }
    
     }
    

posted @ 2023-01-31 20:59  情韵  阅读(72)  评论(0编辑  收藏  举报