为什么final
个变量默认初始化?如果您对常量是默认值感到满意,那么默认构造函数不应该将它们初始化为默认值。
为什么必须在构造函数中初始化它们?为什么你不能像其他变量一样使用它们之前初始化它们?
离。
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
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
我问这些问题,因为我试图找到一个逻辑/概念上的原因,为什么这不起作用,为什么不允许。不只是因为它不是。
答案 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编译器不知道给定语句是否会在其他语句之前执行。这个规则的唯一例外是构造函数和隐式构造函数中的代码,这就是为什么它们是唯一可以分配最终字段的地方。