码迷,mamicode.com
首页 > 编程语言 > 详细

Java 类初始化时机测试

时间:2020-08-03 00:52:33      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:父类静态   nbsp   mic   gif   收集   并且   cep   except   xtend   

<clinit>()方法

Java 类加载的初始化过程中,编译器按语句在源文件中出现的顺序,依次自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生方法。 如果类中没有静态语句和静态代码块,那可以不生成<clinit>() 方法。

并且 <clinit>() 不需要显式调用父类(接口除外,接口不需要调用父接口的初始化方法,只有使用到父接口中的静态变量时才需要调用)的初始化方法 <clinit>(),虚拟机会保证在子类的 <clinit>() 方法执行之前,父类的 <clinit>() 方法已经执行完毕(所以 java.lang.Object 类总是第一个被加载

技术图片

 准备父类和子类

技术图片
class Father {

    static int father_a = 1;

    static {
        System.out.println("父类静态代码块执行");
    }

    static class StaticInnerClass {
        static {
            System.out.println("静态内部类静态代码块执行");
        }
    }
}

class Son extends Father {

    static {
        System.out.println("子类静态代码块执行");
        son_a = 300;
    }

    static int son_a = 100;
    static final int M = 1;
}
View Code

Main方法:

1:父类没有被引用但是会被先加载

new Son();

技术图片

 2:反射也会产生主动引用:

Class a = Class.forName("clinit.Son");

(运行结果同1)

3:子类使用父类静态变量或方法不会产生类的引用

System.out.println("Father.a = " + Son.father_a);

 技术图片

4:通过类创建数组不会加载类(只是开辟一块空间)

Son[] sons = new Son[8];

 技术图片

5:使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)

System.out.println("Son.CONST = " + Son.CONST);

技术图片

 6:引用静态内部类不会加载外部类(应用于单例模式)

new Father.StaticInnerClass();

技术图片

代码总结

技术图片
 1 public static void main(String[] args) throws Exception {
 2 
 3 //        1.父类没有被引用但是会被先加载
 4 //        new Son();
 5 //        2.反射会产生主动引用
 6 //        Class a = Class.forName("clinit.Son");
 7 //        3.子类使用父类静态变量或方法不会产生类的引用
 8 //        System.out.println("Father.a = " + Son.father_a);
 9 //        4.通过类创建数组不会加载类(只是开辟一块空间)
10 //        Son[] sons = new Son[8];
11 //        5.使用常量不会加载父类和之类(常量在Linking阶段就保存在常量池当中了)
12 //        System.out.println("Son.CONST = " + Son.CONST);
13 //        6.引用静态内部类不会加载外部类(应用于单例模式)
14 //        new Son.StaticInnerClass();
15     }
16 }
View Code

PS:由于是按出现的顺序执行的,为了避免不必要的麻烦,应尽量把静态变量写在静态代码块之前

1 public class Test {
2     public static void main(String[] args) {
3         System.out.println("a = " + cls.a);
4     }
5 }
6 class cls {
7     static int a = 10;
8 static { a = 20; }
9 }

技术图片

如果 调换顺序输出结果将是 a = 10

1 class cls {
2     static { a = 20; }
3     static int a = 10;
4 }

技术图片

Java 类初始化时机测试

标签:父类静态   nbsp   mic   gif   收集   并且   cep   except   xtend   

原文地址:https://www.cnblogs.com/whyha/p/13420219.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!