在Java中执行静态块[重复]

问题描述 投票:3回答: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'应该有vaule 20运行程序,但它有价值10为什么?

java static
2个回答
1
投票

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

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

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

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

而这,对于第二堂课:

static
{
    a=20;
}   

static int a; static{a = 10;}

然后按顺序运行静态块。


1
投票

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

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

  public class Basic {
    static int a;

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

标准的良好做法是首先在类中包含声明,然后是静态块,然后是构造函数和其他方法。在声明之前混合静态块会导致混淆,如此示例所示。