【问题标题】:Static variable in an anonymous block in javajava中匿名块中的静态变量
【发布时间】:2016-07-19 19:23:41
【问题描述】:

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

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

我得到这个编译错误说

变量a的非法修饰符;只允许决赛

为什么只有决赛?

【问题讨论】:

  • 这样你不仅要初始化,还要declare,这对于静态成员是不允许的。
  • 你希望它做什么?在实例初始化器中声明的变量是局部变量,不能将局部变量设为静态...

标签: java static initializer


【解决方案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 开头,更多内容请参见上面的链接。

【讨论】:

    【解决方案2】:
    {
          static int a=1;
    }
    

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

    【讨论】:

      【解决方案3】:

      来自

      的文档

      Initialization blocks

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-13
          • 2017-05-27
          • 1970-01-01
          • 2015-10-04
          • 2012-09-12
          • 2016-02-07
          • 1970-01-01
          • 2021-11-29
          相关资源
          最近更新 更多