我在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为什么?
答案 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;
}
标准的良好做法是首先在类中包含声明,然后是静态块,然后是构造函数和其他方法。在声明之前混用静态块会导致混淆,如本例所示。