限制最终变量分配的原因

时间:2012-03-11 02:15:24

标签: java static final

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

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

  3. 离。

    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个变量?为什么不能在使用任何其他方法之前初始化它们?
    2. 离。

      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
      

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

4 个答案:

答案 0 :(得分:3)

final变量背后的想法是它只设置一次。

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

对于static final变量,它们只能在声明或静态初始化块中设置。其他任何地方都必须采用一种可以被称为更多次的方法:

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

关于你的第一个问题,我假设没有明确设置final变量以避免程序员的错误,这是一个错误。

答案 1 :(得分:1)

Java Language Specification section 8.3.1.2阐明final成员变量的规则:

  

可以声明一个字段final(§4.12.4)。类和实例变量(static和非 - static字段)都可以声明为final。

     

如果空类final(§4.12.4)类变量未被类的static初始值设定项(第8.7节)明确赋值(第16.8节),则为编译时错误宣布它。

     

必须在声明它的类的每个构造函数(第8.8节)的末尾明确赋值空白final实例变量(第16.9节);否则会发生编译时错误。

JLS没有给出理由为什么规则是他们的方式。但是,它可能来自编写Java代码的经验,而上述规则是避免一些常见编码错误的方法。

答案 2 :(得分:0)

最终的概念意味着变量值不能改变。如果你可以像你的第二个例子那样做,那么这个变量就像任何其他变量一样(即不是最终的)

关于你的第一个问题,我没有理智。

答案 3 :(得分:0)

因为在查看代码时,Java编译器不知道给定语句是否会在其他语句之前执行。这个规则的唯一例外是构造函数和隐式构造函数中的代码,这就是为什么它们是唯一可以分配最终字段的地方。