Java中静态块的执行

Java中静态块的执行,java,static,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) 第二

我正在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方法之前运行,然后将a的值重新分配到20,但在第二个代码块中,我是块之前的初始化变量“a”,并且变量“a”在运行程序时应具有值20,但是它有10个值为什么?

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

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

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

static int a; static{a = 10;}
static
{
    a=20;
} 
对于第二类:

static
{
    a=20;
}   

static int a; static{a = 10;}

然后按顺序运行静态块。

Java运行时系统保证按照静态初始化块在源代码中出现的顺序调用它们

对于第二个代码示例,以下是运行时系统如何执行声明之后的初始化。
a=10
初始化本质上是一个静态块,它按照
a=20
赋值之后的源代码中出现的顺序执行,因此打印的值是10而不是20

  public class Basic {
    static int a;

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

标准的良好实践是首先在类中包含声明,然后是静态块,然后是构造函数和其他方法。如本例所示,在声明之前混合静态块可能会造成混乱。

您真的不知道吗?第一段和第二段有什么不同?你的结论是什么?如果是这样,那么如果我移动
static int a
最后,值应该是
0
,因为原语
int
默认值是
0
,不是吗?