`

Static块什么时候运行

 
阅读更多

为了搞清楚这个我们首先要知道一个类想要运行JVM会做哪些事情。

1、类装载

采用双亲委派模式加载类,子类会交给父类的classloader去加载,如果父类加载不到自己才会尝试加载。最终功能是将java字节码转换为JVM的class对象。

2、链接

将Java二进制代码合并到JVM的运行时状态中。在链接之前必须保证类已经被加载。期间会经过验证、准备和解析等几个步骤。验证确保java类的二进制表示在结构上是完全正确的,如果不正确抛出java.lang.VerifyError。准备过程则是创建类中的静态域并默认赋初值。解析的过程确保类引用的类能被找到。

3、初始化

当一个类真正被使用的时候,JVM会初始化该类。主要操作就是执行静态代码块和初始化静态域。

4、实例化

在内存中开辟堆空间。

从上我们可以看出,静态代码块在类初始化的时候执行。反应到代码上也就是在class.forname时执行。如下例子:

两个类Word:

Office:

执行代码结果如下:

从上分析得出如下结论,类只被加载一次。并且静态代码块只在类初始化的时候被执行一次,第二次不会执行。

但是如果将上述代码改为:


执行结果如下:


从上结合JDK分析我们可以得出如下结论:

1、我们可以控制类加载链接时不初始化

2、类在实例化时如果没有初始化,那么触发初始化。

3、静态代码块只执行一次,并且只在初始化时执行




分享到:
评论

相关推荐

    Java中的Static块与静态方法

    2. **只执行一次**:每个类的静态块在整个程序运行期间只执行一次。 3. **按出现顺序执行**:如果一个类中有多个静态块,它们将按照在源代码中出现的顺序依次执行。 ### 静态方法与静态块的区别与联系 虽然静态...

    TIA博途中FB和FC块里的IN,Inout,Out的区别以及Static和Temp变量的用法.docx

    5. Temp变量:Temp变量与Static变量相似,也允许在程序块内进行读写,但其特点是数据不会在扫描周期之间保持。每个扫描周期开始时,Temp变量会自动初始化为零,因此必须在每次使用前为其赋值。这种变量适合临时存储...

    java中static作用

    静态代码块也叫静态代码块,是在类中独立于类成员的 static 语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM 加载类时会执行这些静态的代码块。如果 static 代码块有多个,JVM 将按照它们在类中出现...

    static关键字简介

    类的成员变量 成员方法或者是代码块 下面我们就来说说这个 static 关键字 有时候程序员可能需要定义一个类成员 对它的使用不依赖于该类的任何对象 要创建 这样的成员 成员变量声明前必须加上关键字 static 成员声明...

    static的使用方法

    当`static`和`final`一起使用时,创建的是常量,其值在编译时确定,并在整个程序运行期间保持不变。例如: ```java public class Constants { public static final double PI = 3.14159; // 常量PI } ``` 6....

    static 的使用场合

    3. **静态块(Static Initialization Blocks)** - 静态初始化块用于在类加载时初始化静态变量,可以有多个,按顺序执行。 - 通常用于执行一次的初始化操作,比如初始化静态变量或进行资源分配。 - 示例: ```...

    java中static属性学习

    静态语句块通常用于执行一些只需要运行一次的初始化操作,在类加载时被执行。 ##### 示例代码分析: ```java class Father { private int li_int = 0; static { System.out.println("static father555"); } ...

    Java静态初始化块和对象初始化块

    例如,如果一个类需要在程序运行前设置一个常量数组,静态初始化块就是合适的选择。 ```java public class InitFiledBlockStatic { static int[] staticArray; static { // 静态初始化块中的代码 staticArray ...

    c语言中static_用法总结

    全局静态变量存储在静态存储区,这意味着在整个程序运行期间,这些变量一直存在于内存中。 **2. 初始化** 未显式初始化的全局静态变量会被自动初始化为0。相比之下,非静态的全局变量如果没有显式初始化,则其初始...

    static 关键字详解

    在`static`代码块中,`b`被初始化为`a * 4`,这意味着`b`的值依赖于`a`的初始值。 静态方法是不依赖于任何特定实例的方法,可以直接通过类名调用,而无需创建对象。在`UserStatic`类中,`static void meth(int x)`...

    static 在java中的作用

    `static`是Java语言中的一个关键字,主要用来修饰类成员(变量、方法或代码块),其核心功能在于定义类级别的共享属性。通过使用`static`,可以实现对类属性和方法的共享访问,而无需创建类的实例。这在实际编程中...

    有关static block静态代码块和单态设计模式

    在Java编程语言中,`static`关键字用于声明类级别的成员,包括静态变量和静态代码块。静态代码块,也就是`static block`,是Java中的一种特殊构造,它不包含在任何方法内,当类被加载时,静态代码块会被自动执行且仅...

    C语言中static用法大全

    1. **内存位置**: 存放在静态存储区,这部分存储区在整个程序运行期间都存在。 2. **初始化**: 未初始化的全局静态变量会被程序自动初始化为0(对于整型为0,浮点型为0.0,字符型为'\0',指针为空指针)。 3. **作用...

    c语言中static使用方法

    - **关键字static的历史**:在C语言中,`static`关键字最初被引入是为了表示在退出一个块后仍然存在的局部变量。随后,`static`又获得了另一种含义:用来表示不能被其他文件访问的全局变量和函数。尽管如此,为了不...

    关于static的小结(Java内存溢出)

    `static`关键字在Java语言中扮演着重要的角色,它主要用于声明静态变量、静态方法或静态代码块。当一个成员被标记为`static`时,意味着这个成员属于类本身而非对象实例。这意味着无论创建多少个该类的对象,`static`...

    static,const,volatile用法

    - 在函数内部定义的静态变量在整个程序运行期间只初始化一次,并保持其值直到程序结束。这意味着即使函数多次调用,该变量的值也不会丢失。 - 局部静态变量的作用域仅限于声明它的函数或代码块,但生命周期却跨越...

    static静态变量使用@Value注入方式.md

    ### static静态变量使用@Value注入方式 #### 一、引言 在Java开发中,特别是基于Spring框架的应用程序中,开发者经常会遇到需要为类中的成员变量注入外部配置值的情况。Spring框架提供了多种注入机制,其中`@Value...

    static and final.

    4. **工具类**:为了防止实例化工具类,通常将工具类的构造器声明为 `private` 并使用 `static` 方法来提供功能,有时候还需要将某些方法声明为 `final` 来避免被重写。 通过上述讨论可以看出,`static` 和 `final`...

    面向过程设计中的static静态成员

    与普通全局变量不同,静态全局变量在程序运行期间只被初始化一次,即使在多个函数调用中,它的值也会保持不变。 示例: ```cpp // File1.cpp extern int n; void fn(); int main() { n = 20; cout ; fn();...

Global site tag (gtag.js) - Google Analytics