参考链接: Java中的初始化程序块Initializer Block

关于这个问题,本文不扯理论,直接上代码,通过结果来验证结论,废话少说,测试代码如下:

public class StaticTest {

public static StaticMember staticMember = new StaticMember();

static {

System.out.println("static code initializer ");

}

private static class InnerClass {

private static StaticTest staticTest = new StaticTest("load from InnerClass");

}

public StaticTest() {

}

public StaticTest(String a) {

System.out.println(a);

}

public static void f(){

}

public void d(){

}

public static void e(){

InnerClass.staticTest.d();

}

}

public class StaticMember {

public StaticMember(){

System.out.println("StaticMember");

}

}

在StaticTest 测试类中我写了三种静态域分别是静态成员变量,静态代码块以及静态内部类,下面通过不同的case测试上面三种静态域何时被初始化。  测试case代码:

public class Main {

static boolean flg;

public static void main(String[] args) {

/**case1**/

//不会执行静态代码块, 静态成员变量不会初始化, 也不会加载静态内部类

String simpleName = StaticTest.class.getSimpleName();

/**case2**/

//会执行静态代码块, 静态成员变量会初始化, 不会加载静态内部类

//输出 StaticMember

//    static code initializer

StaticMember staticMember = StaticTest.staticMember;

/**case3**/

//会执行静态代码块, 静态成员变量会初始化, 不会加载静态内部类

//输出 StaticMember

//    static code initializer

new StaticTest();

/**case4**/

//会执行静态代码块, 静态成员变量会初始化, 不会加载静态内部类

//输出 StaticMember

//    static code initializer

StaticTest.f();

/**case5**/

//不会执行静态代码块, 静态成员变量不会初始化, 也不会加载静态内部类

if (flg) {

test();

}

/**case6**/

//会执行静态代码块, 静态成员变量会初始化, 同时加载静态内部类

// 输出:StaticMember

//      static code initializer

//      load from InnerClass

StaticTest.e();

}

private static void test(){

StaticTest.f();

StaticTest.e();

}

}

通过上面每一种代码测试case的输出结果,可以得出如下结论:

静态成员变量和静态代码块(static{})只有在类被调用的时候才会初始化。  这里是指在运行时真正被使用到才会被初始化,如果是在编译时被使用到,但在运行时没有使用到也不会被初始化,比如上面的case5。静态内部类只有当被外部类调用到的时候才会初始化。  这里也是指在运行时,也就是说不在于你在编辑器中有没有写调用的代码,而是你写的这段调用代码运行时是否会被真正执行到。在只使用了外部类,但是没有使用内部类的情况下,内部类里面的东西不会被初始化。

关于case1的情况,直接引用StaticTest.class不会初始化静态变量和静态代码块,而直接new StaticTest()就会,为什么呢?因为JVM在加载类的过程中分为五个阶段:加载、验证、准备、解析、初始化,StaticTest.class的方式发生在第一个阶段,这个阶段会在Java堆中创建java.lang.Class的实例,而变量和静态块是发生在最后一个初始化的阶段,具体参考:Java虚拟机 类加载的过程, Chapter 5. Loading, Linking, and Initializing

[转载] Java中静态成员变量,静态代码块,静态内部类何时被初始化?相关推荐

  1. Java中的static静态代码块

    一.与静态方法的比较 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要 ...

  2. java子类代码块_java中父类子类静态代码块、构造代码块执行顺序

    父类静态(代码块,变量赋值二者按顺序执行) 子类静态 父类构造代码块 父类构造方法 子类构造代码块 子类构造方法 普通方法在实列调用的时候执行,肯定位于上面之后了 //父类A public class ...

  3. java中的四种代码块

    原文链接: java中的四种代码块_Munt的博客-CSDN博客_java中代码块 在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造 ...

  4. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  5. java 静态代码块_Java中的static静态代码块的使用详解

    一.与静态方法的比较 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要 ...

  6. java 静态代码块的作用_Java中什么是静态代码块,有什么作用?

    在java中使用static关键字声明的代码块.静态块用于初始化类,为类的属性初始化.每个静态代码块只会执行一次.静态代码块随着类加载而加载,有多个静态代码块的,按代码块前后顺序加载. 由于JVM在加 ...

  7. java中的构造方法与代码块

    一.构造方法 1.1.java中的构造方法跟普通方法有很大的区别: 构造方法的方法名跟类名相同 构造方法没有返回值类型,连void也没有,也不能用return返回值 每次创建一个对象,都会调用构造方法 ...

  8. Java基础-day08-static·static静态代码块·final 关键字·多态·汽车设计综合案例·异常

    day09 1.static 是java中的一个关键字 用于修饰成员(成员变量和成员) 1.static是一个关键字 2.static可以修饰成员变量和方法,被修饰的资源就是静态资源 3.静态资源优先 ...

  9. 【 史上最坑爹的Java代码系列02 】Java中的三种代码块

    Java中有三种代码块,三种代码块中的代码执行的优先级是面试中会被提问到的问题. 三种代码块:静态代码块.方法代码块.普通代码块 其中,普通代码块是比较少见而且比较少使用的. package com. ...

最新文章

  1. 是男人就下100层【第四层】——Crazy贪吃蛇(2)
  2. Python的f-strings格式化
  3. 5-4 是否同一棵二叉搜索树 (25分)
  4. jmeter参数值只读取了第一个_基础入门篇Jmeter(五)_函数
  5. foo( a )JAVA面试题_Java相关面试题总结+答案(五)
  6. Spring : AutowireCapableBeanFactory自动装配能力
  7. 中小企业数智化转型,这个百万级客户市场差点被遗忘
  8. 西门子PLC程序下载方法简介
  9. 毕业论文外文文献在哪里找?
  10. 编写代码实现简单的扫雷游戏
  11. 各国海关单证有哪些要求?
  12. 怎样制作网关服务器,如何设计自己的网关(一)
  13. JAVA中的“人妖”
  14. mac微信怎么设置代理服务器,微信Mac版怎么管理群成员?微信Mac版管理群成员的方法...
  15. 五个python小练习
  16. C++ 结构体嵌套结构体
  17. 黑盒测试方法五(场景法)
  18. unet分割如何取其中一类_深度学习与医学图像处理 案例学习1——Unet肺部分割(CT图像)...
  19. 图像处理中的香农采样定理
  20. C++中拷贝构造函数与赋值构造函数详解

热门文章

  1. Spark之scala学习(基础篇)待更新
  2. 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
  3. c++ dicom图像切割_【高训智造】原创专业课堂第225期--定位滑座的线切割加工
  4. java安全(五)java反序列化
  5. python 安装html,python安装glob
  6. 动态新增表字段_制作动态的数据透视表(一):定义名称法创建数据透视表
  7. python3.8.0安装_Python3.8.0
  8. windows进程管理器_任务管理器就能搞定9成的电脑问题?方法在这里!
  9. Docker原理剖析
  10. Web端H.265播放器研发解密