文档章节

java 中静态代码块执行的时机

Java搬砖工程师
 Java搬砖工程师
发布于 07/06 10:27
字数 746
阅读 8
收藏 4

1、简单认为JAVA静态代码块在类被加载时就会自动执行  是错误的


class MyClass1 {
    static {//静态块
        System.out.println("static block ");
    }
}
public class Main {
 
    Class[] classArray = {
            MyClass1.class//这样引用该类,必然需要将该类加载到虚拟机中
    };
    public static void main(String[] args){
        System.out.println("hello word");//执行结果:并没有输出" static bolck" 
    }
 
}

2、正解:static块真正的执行时机

一个类的运行分为以下步骤:

  1. 装载
  2. 连接
  3. 初始化

装载阶段

  1. 通过类型的完全限定名,产生一个代表该类型的二进制数据流
  2. 解析这个二进制数据流为方法区内的内部数据结构
  3. 创建一个表示该类型的java.lang.Class类的实例

补充:如果一个类装载器在预先装载的时遇到缺失或错误的class文件,它需要等到程序首次主动使用该类时才报告错误

 连接阶段

  1. 验证,确认类型符合Java语言的语义,检查类之间的二进制兼容性(如final的类不用拥有子类等),另外还需要进行符号引用的验证
  2. 准备,Java虚拟机为类变量分配内存,设置默认初始值
  3. 解析(可选的) ,在类型的常量池中寻找类,接口,字段和方法的符号引用,把这些符号引用替换成直接引用的过程

当一个类被主动使用时,Java虚拟就会对其初始化

如下六种情况为主动使用:

  1. 当创建某个类的新实例时(如通过new或者反射,克隆,反序列化等)
  2. 当调用某个类的静态方法时
  3. 当使用某个类或接口的静态字段时
  4. 当调用Java API中的某些反射方法时,比如类Class中的方法,或者java.lang.reflect中的类的方法时
  5. 当初始化某个子类时
  6. 当虚拟机启动某个被标明为启动类的类(即包含main方法的那个类)

Java编译器会收集所有的类变量初始化语句和类型的静态初始化器,将这些放到一个特殊的方法中:clinit

3、实际上,static块的执行发生在“初始化”的阶段

  • 初始化阶段,jvm主要完成对静态变量的初始化,静态块执行等工作

执行static块的几种情况:

  1. 第一次new A()的过程会打印"";因为这个过程包括了初始化
  2. 第一次Class.forName("A")的过程会打印"";因为这个过程相当于Class.forName("A",true,this.getClass().getClassLoader())
  3. 第一次Class.forName("A",false,this.getClass().getClassLoader())的过程则不会打印 ""因为false指明了装载类的过程中,不进行初始化。不初始化则不会执行static块

© 著作权归作者所有

共有 人打赏支持
上一篇: apache 职责链
下一篇: 迭代设计模式
Java搬砖工程师
粉丝 26
博文 283
码字总数 193518
作品 0
南京
程序员
私信 提问
java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题

/* * 几大原则 * 一、静态成员变量(Static) * 1、静态成员变量为类变量,所有对象共享同一内存空间 * 2、静态成员变量的声明和定义仅在首次加载类时执行一次 * 3、首次加载类时首先对所有静...

LCZ777
2014/08/25
0
0
类加载时机与过程 asdfsadfasdfsa 09-19 268

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/79612719 通过之前的介绍可知,类加载过程共有5个步骤,分别是:加载、验证、准...

追风筝的猪
03/20
0
0
Java和Android ClassLoder对比以及Class加载过程

Java的ClassLoder的父子关系如下:Bootstrap--ExtClassClassLoader---AppClassLoader。 JVM启动时先运行启动类加载器Bottstrap,主要加载Java核心API;然后加载扩展类加载器ExtClassLoder,该...

JasmineBen
05/23
0
0
Kotlin 设计模式解析之单例

单例模式介绍 单例模式是一个比较简单的设计模式,同时也是挺有意思的一个模式,虽然看起来简单,但是可以玩出各种花样。比如 Java 当中的懒饿汉式单例等。 什么是单例 单例模式的定义: En...

yonglan.whl
09/20
0
0
【Java并发性和多线程】Java同步块

本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/synchronized.html 译文链接:http://ifeve.com/synchronized-blocks/ Java 同步块(synchronized block)用来标记......

heroShane
2014/01/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

flutter Expanded用法

使用的地方:一个分类,类似京东的,左右两边都可以滑动 Widget build(BuildContext context) { return Row(children: [ Column( children: <Widget>[ Ex......

大灰狼wow
4分钟前
0
0
Java8 Map中新增的方法使用总结

前言 得益于 Java 8 的 default 方法特性,Java 8 对 Map 增加了不少实用的默认方法,像 getOrDefault, forEach, replace, replaceAll, putIfAbsent, remove(key, value), computeIfPresent,......

kaixin_code
14分钟前
0
0
@TransactionConfiguration

@TransactionConfiguration过时与替代写法 @TransactionConfiguration 替代写法

miaojiangmin
16分钟前
0
0
浅谈Vue响应式(数组变异方法)

很多初使用Vue的同学会发现,在改变数组的值的时候,值确实是改变了,但是视图却无动于衷,果然是因为数组太高冷了吗? 查看官方文档才发现,不是女神太高冷,而是你没用对方法。 看来想让女...

开元中国2015
17分钟前
1
0
Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

  这篇博文本来是想放在全系列的大概第五、六篇的时候再讲的,毕竟查询是在索引创建、索引文档数据生成和一些基本概念介绍完之后才需要的。当前面的一些知识概念全都讲解完之后再讲解查询是...

SEOwhywhy
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部