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

参考链接: 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540298.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mikrotik dhcp server

操作路径: /ip dhcp-server 关联操作: /ip pool属性 述 dhcp server interface (名称) – 选择 DHCP 服务的网络接口 dhcp address space (IP 地址/掩码; 默认: 192.168.0.0/24) – DHCP 服务器将出租给客户端的网络地 址段 gateway (IP 地址; 默认: 0.0.0.0) – 分配给客户端的…

[转载] Java static关键字与static{}语句块

参考链接: Java中的静态块static block 目录直通车 一、 类的加载特性与时机 1、 类加载的特性 2、 类加载的时机 二、 static的三个常用 1、 修饰成员变量 2、 修饰成员方法 3、 静态块(static{}) 一、 类的加载特性与时机 …

Perl文件读写操作

本文转自 tiger506 51CTO博客,原文链接:http://blog.51cto.com/tiger506/830771,如需转载请自行联系原作者

[转载] Java 语言中的实例初始化块 ( IIB) 详解

参考链接: Java中的实例初始化块(IIB) 在 Java 语言中的类初始化块 文章中我们简单的介绍了下 Java 中的实例初始化块 ( IIB )。不过我觉得介绍的有点简单了,于是,再写一篇文章详细介绍下吧。 Java 语言中,存在三种操作&#x…

不用正则表达式,用javascript从零写一个模板引擎(一)

前言 模板引擎的作用就是将模板渲染成html,html render(template,data),常见的js模板引擎有Pug,Nunjucks,Mustache等。网上一些制作模板引擎的文章大部分是用正则表达式做一些hack工作,看完能收获的东西很少。本文将使用编译原理那套理论来打…

[转载] Java静态绑定与动态绑定

参考链接: Java中的静态绑定与动态绑定 程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方…

关于批量插入数据之我见(100万级别的数据,mysql)

2019独角兽企业重金招聘Python工程师标准>>> 因前段时间去面试,问到如何高效向数据库插入10万条记录,之前没处理过类似问题,也没看过相关资料,结果没答上来,今天就查了些资料,总结出三种方法&am…

各个OS关于查看磁盘和wwn号的方法

1,HP-UX几个命令1)查看型号,和uname -a差不多model2)查看光纤卡信息ioscan -funC fc3) 查看扫描出的磁盘信息ioscan -fucC disk4)查看磁盘及其对应的路径ioscan -m dsf5) 查看划分过来的lunioscan -m lun6) 查看磁盘大小diskinfo …

[转载] Java是不是面向对象的程序

参考链接: 为什么Java不是纯粹的面向对象语言 转载自:https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否确实的 “纯面向对象”?让我们深入到Java的世界,试图来证实它。 在我刚开始学习 Java 的前面几…

极速理解设计模式系列:6.适配器模式(Adapter Pattern)

四个角色:目标抽象类角色(Target)、目标对象角色(Adapter)、源对象角色(Adaptee)、客户端角色(Client) 目标抽象类角色(Target):定义需要实现的目标接口 目标对象角色(Adapter):调用另外一个源对象,并且转换…

[转载] Java之继承

参考链接: Java多重继承 Java之继承 继承是面向对象程序的一个基本特征,通过继承可以实现父子关系,以及代码的复用。通过继承实现的类称为子类,被继承的类称为父类,所有直接或间接被继承的类都称为父类。 Java类体…

Spark(二): 内存管理

2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块; Spark的内存可以大体归为两类:execution和storage,前者包括shuffles、joins、sorts和agg…

[转载] 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

参考链接: Java继承类的对象创建 本文发表于2016年6月,写于作者学生时期。文中使用到的技术和框架可能不是当下最佳实践,甚至很不“优雅”。但对于刚接触JavaEE和Spring的同学来说,还是能有很多收获的,大牛轻拍 我们…

多播、组播、广播优缺点分析

2019独角兽企业重金招聘Python工程师标准>>> 单播、多播和广播单播”(Unicast)、“多播”(Multicast)和“广播”(Broadcast)这三个术语都是用来描述网络节点之间通讯方式的术语。那么这些术语究…

[转载] Java重载、覆盖与构造函数

参考链接: Java中的继承和构造函数 /** * 拷贝构造函数---Copyf t2 new Copyf(t1);就不会在调用默认构造函数了。 * 复制clone和引用 * 重载是在同一个类(范围)中,覆盖是子类对父类而言。 重载不关心返回值类型。 静态方法不能被…

LOFTERD18B542F16FF685FD684F427B4…

2019独角兽企业重金招聘Python工程师标准>>> 验证 转载于:https://my.oschina.net/jinhengyu/blog/1572124

[转载] Java获取一个类继承的父类或者实现的接口的泛型参数

参考链接&#xff1a; Java中的接口和继承 泛型的作用就不多介绍了&#xff0c;如果你想具备架构设计能力&#xff0c;那么熟练使用泛型是必不可少的。 不多说了&#xff0c;先定义泛型父类和泛型接口&#xff1a; package cn.zhh; public class Parent<T1, T2> { …

PHP系列(一)PHP流程控制结构

while(){} do{ }while(); for( 表达式1; 表达式2;表达式3 ){ 语句或语句序列; } if(){} if(){ }elseif{} <?php $i0; while(true) { if($i>100) break; echo ".$i.<br>"; $i; } ?> <?php echo "<table border1800>"; echo &quo…

[转载] Scala继承与Java的区别

参考链接&#xff1a; Java中将final与继承一起使用 在之前的笔记Java静态属性和方法的继承问题中&#xff0c;通过具体的实验证明&#xff0c;在子类中重写父类的字段时并没有覆盖父类的字段&#xff0c;只是隐藏了父类的字段。而在scala中则不同&#xff0c;scala子类的同名…

Source Map调试压缩后代码

在前端开发过程中&#xff0c;无论是样式还是脚本&#xff0c;运行时的文件可能是压缩后的&#xff0c;那这个时候调试起来就很麻烦。 这个时候&#xff0c;可以使用Source Map文件来优化调试&#xff0c;Source Map是一个信息文件&#xff0c;里面储存着原代码位置信息&#x…