有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中静态块的执行

我正在用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方法之前运行静态块是什么时候,那么为什么我在第二个代码中有不同的输出。 在第一个代码中,静态块将在main方法之前运行,然后将a的值重新分配到20,但在第二个代码块中,我是块之前的初始化变量“a”,并且变量“a”在运行程序时应该有值20,但它有值10为什么


共 (2) 个答案

  1. # 1 楼答案

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

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

      public class Basic {
        static int a;
    
        static
        {
            a = 20;
        }
        static
        {
            a = 10;
        }
    

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

  2. # 2 楼答案

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

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

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

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

    第二节课:

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

    然后按顺序运行静态块