java - Java中静态 block 的执行

标签 java static

<分区>

我在 Java 中运行以下代码:

1) 第一个代码:

public class Basic {


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

    public static void main(String args[])
    {
    System.out.println("Value of Static variable : "+Basic.a);
    }
}

输出是:静态变量的值:20

2) 第二个代码:

public class Basic {
    static
    {
        a=20;
    }   

    static int a=10;

    public static void main(String args[])
    {
    System.out.println("Value of Static variable : "+Basic.a);
    }
}

输出是:静态变量的值:10

问题:当 JVM 在 main 方法之前运行静态 block 时,我没有得到,为什么我在第二个代码中有不同的输出。 在第一个代码中,静态 block 将在 main 方法之前运行,然后它将 a 的值重新分配给 20 ,但是在第二个代码块中,我在 block 之前初始化变量 'a' 并且变量 'a' 应该有 vaule 20 时运行程序,但它的值为 10,为什么?

最佳答案

理解这一点的最简单方法是将静态字段的初始化和静态初始化 block 的执行视为相同。这意味着 Java 将为该字段分配内存(只需创建字段),然后按顺序运行静态初始化。如果在字段之前找到静态初始化 block ,则首先运行它,值初始化将覆盖它。

同样适用于实例初始化字段和实例字段。

为了简化这一点,假设 Java 为每个字段初始化创建了一个静态初始化 block ,就像您编写的代码一样:

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

第二节课:

static
{
    a=20;
}   

static int a; static{a = 10;}

然后按顺序运行静态 block 。

关于java - Java中静态 block 的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857836/

相关文章:

用于 GUI 创建的 Java Swing 进度监视器 (EDT)

delphi - Delphi DLL组织-静态和动态加载

java - 静态函数返回错误值?

ios - 在 Objective-C 中使用类似 C 的静态变量是不好的做法吗?

c# - 所有事件的 ThreadLocal<T> 和 [ThreadStatic] 引用的列表

java - 我的图形无法绘制

java - 如何在不同的 Eclipse 项目之间共享资源,以避免重复?

java - JAR 中的 Spring Boot ClassPathResource

java - 如何使用 Selenium 获取 css 类名?

PHP:5.2.x 的 __callStatic 替代方案