Java类初始化时机测试方法解析

所属分类: 软件编程 / java 阅读数: 64
收藏 0 赞 0 分享

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

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();

代码总结:

public static void main(String[] args) throws Exception {

//    1.父类没有被引用但是会被先加载
//    new Son();
//    2.反射会产生主动引用
//    Class a = Class.forName("clinit.Son");
//    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 Son.StaticInnerClass();
  }
}

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

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

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

 class cls {
   static { a = 20; }
   static int a = 10;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Javaweb 鼠标移入移出表格颜色变化的实现

这篇文章主要介绍了Javaweb 鼠标移入移出表格颜色变化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java 实现图片压缩的两种方法

这篇文章主要介绍了Java 实现图片压缩的两种方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

据说这个是可以撸到2089年的idea2020.2(推荐)

这篇文章主要介绍了据说这个是可以撸到2089年的idea2020.2,本教程给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

这篇文章主要介绍了一篇文章带你搞定SpringBoot不重启项目实现修改静态资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

win10操作系统下重启电脑java环境变量失效

这篇文章主要介绍了win10操作系统下重启电脑java环境变量失效,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java实现批量修改文件名和重命名的方法

这篇文章主要介绍了Java实现批量修改文件名和重命名的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

关于Java HashMap自动排序的简单剖析

这篇文章主要给大家介绍了关于Java HashMap自动排序的简单剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring中BeanFactory和ApplicationContext的作用和区别(推荐)

这篇文章主要介绍了Spring中BeanFactory和ApplicationContext的作用和区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java程序执行Cmd指令所遇问题记录及解决方案

这篇文章主要介绍了Java程序执行Cmd指令所遇问题记录,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

深入浅析jni中的java接口使用

这篇文章主要介绍了jni中的java接口使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多