java中匿名块中的静态变量

时间:2016-03-31 11:09:29

标签: java static initializer

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

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

我得到这个编译错误说 "变量a的非法修饰符;只允许决赛#34;

为什么只有最终? 有人可以帮帮我吗?提前致谢

4 个答案:

答案 0 :(得分:1)

来自

的文档

Initialization blocks

  

Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。

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

您在错误消息中看到仅允许最终,因为如果您尚未在声明时初始化它们,则可以修改构造函数中的最终变量。

答案 1 :(得分:1)

{
      static int a=1;
}

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

答案 2 :(得分:1)

直接在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个初始化程序块,它们在加载类时对静态内容做同样的事情。它们以关键字static开头,在上面的链接中更多。

答案 3 :(得分:0)

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

{{1}}