在Java

时间:2017-12-17 17:44:25

标签: 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方法之前运行,然后它将a的值重新分配给20,但在第二个代码块中,我是初始化变量' a'在块和变量之前' a'在运行程序时应该有vaule 20,但它的值为10为什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

这就是第二节课:

static
{
    a=20;
}   

static int a; static{a = 10;}

然后按顺序运行静态块。

答案 1 :(得分:1)

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

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

  public class Basic {
    static int a;

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

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