java - 限制final变量赋值的原因

标签 java static final

  1. 为什么 final 变量没有默认初始化?如果您对常量作为默认值感到满意,那么默认构造函数不应该将它们初始化为默认值。

  2. 为什么必须在构造函数中初始化它们?为什么不能像其他变量一样在使用它们之前先初始化它们?

例如。

public class Untitled {

public final int zero;

     public static void main(String[] args)
     {
          final int a; // this works
          a = 4; // this works, but using a field doesn't
          new Untitled();
     }
}

Untitled.java:2: variable a might not have been initialized
  1. 为什么在声明static Final 变量时必须对其进行初始化?为什么不能在任何其他方法中使用它们之前先初始化它们?

例如。

public class Untitled
{

      public final static int zero;

      public static void main(String[] args)
      {
           zero = 0;
      }
}

Untitled.java:8: cannot assign a value to final variable zero

我问这些问题是因为我试图找到一个逻辑/概念上的原因,为什么这不起作用,为什么不允许。不仅仅是因为它不是。

最佳答案

final 变量背后的想法是它被设置一次且仅一次。

对于实例 final 变量,这意味着它们只能在初始化期间设置,无论是在声明时、在构造函数中还是在实例初始化 block 中。对于要在其他任何地方设置的变量,必须在非构造函数方法中进行,该方法可以被多次调用 - 这就是为什么这是禁止的。

staticfinal变量类似,它们只能在声明时或静态初始化 block 中设置。任何其他地方都必须位于可以多次调用的方法中:

public static void main(String[] args)
{
     zero = 0;
     main(null);
}

关于你的第一个问题,我假设不显式设置 final 变量以避免程序员犯错是错误的。

关于java - 限制final变量赋值的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9651841/

相关文章:

java - 为什么MyAnnotation的定义需要Documented、Inherited、Retention & RetentionPolicy?

c# - 需要有关 OOP 哲学的建议

c++ - 使成员函数中的静态变量独立于每个实例

java - 从内部类内部访问 LibGDX 变量

java - 关键字final有什么用?

java - Android - 适配器数据更改后,滚动到 ListFragment 中 ListView 中的位置

java - 旋转过渡后如何将节点返回到其原始位置

java - 将方法的参数标记为 final 会使方法调用更快吗?

java - JSF 单元测试

java - 为什么我不能在泛型类上静态引用内部类的静态方法?