java 匿名块中的静态变量

Static variable in an anonymous block in java

为什么我们不能在java中的匿名块中初始化静态变量? 例如: 为什么这段代码不能编译?

public class A {
  {
      static int a = 1;
  }
}

我得到这个编译错误

Illegal modifier for the variable a; only final is permitted

为什么只有决赛?

来自

的文档

Initialization blocks

The Java compiler copies initializer blocks into every constructor. Therefore, this approach can be used to share a block of code between multiple constructors.

您编写的代码将移至构造函数。局部于构造函数的静态成员没有多大意义 它们必须在 class 级别声明 而不是局部于构造函数

并且您在错误消息中看到 只允许 final,因为如果您在声明时尚未初始化它们,则可以在构造函数中修改 final 变量.

{
      static int a=1;
}

代码块中不能有static修饰符,a这里只是一个局部变量

直接在 class 内,一个块是 instance initializer block。您不能在实例初始化程序块中声明静态变量。只需将其从块中删除:

public class A {
    static int a=1;
}

在创建实例时调用实例初始化程序块,先于任何实例构造函数中的代码。所以你不能在那里声明成员(静态或其他)是有道理的。它们是代码,就像在构造函数中一样。示例:

import java.util.Random;

public class Example {
    private String name;
    private int x;
    private int y;

    {                                     // This is the
        this.x = new Random().nextInt();  // instance
        this.y = this.x * 2;              // initializer
    }                                     // block

    public Example() {
        this.name = null;
    }

    public Example(String name) {
        this.name = name;
    }
}

在上面,无论使用哪个构造函数,首先发生的是实例初始化块中的代码,然后是使用的构造函数中的代码。

还有 static 初始化程序块,当加载 class 时,它们对静态内容执行相同的操作。它们以关键字 static 开头,更多在 link 上面。

您可以在静态块中进行静态字段初始化。但不是声明。

public class A{
  static int a;
  static
  {
    a = 1;
  }
}