为什么java允许这个
public class A {
private int i;
public A(int i){
}
}
但不是这个
public class A {
private final int i;
public A(int i){ // compile - time error
}
}
当项目最终时,将项目推送到堆栈有什么区别?为什么它不理解A(i)与final int i不同?
答案 0 :(得分:7)
构造函数中的变量与最终类成员无关,您获得的编译时错误是由于最终变量不仅仅是初始化。
试试这个会起作用
private final int i=0;
或
class A {
private final int i;
public A(int i){
this.i = i;
}
}
或强>
class A {
private final int i;
public A(int i) {
}//constructor over
{//initilizer block
i = 10;
}
}
编译器需要在初始化对象时初始化最终成员。
答案 1 :(得分:6)
在构造函数中为i
指定值时,它将允许第二个代码段:
public class A {
private final int i;
public A(int i){
this.i = i;
}
}
请注意,这是您创建Immutable objects。
的方法答案 2 :(得分:6)
final
个成员字段。
来自Java Language Specification, 3rd Edition
8.3.1.2
final
字段可以声明一个字段
final
(§4.12.4)。类和实例变量(static
和非 -static
字段)都可以声明为final
。 如果空类final
(§4.12.4)类变量未被类的static
初始值设定项(第8.7节)明确赋值(第16.8节),则为编译时错误声明。必须在声明它的类的每个构造函数(第8.8节)的末尾明确赋值(第16.9节)空白
final
实例变量;否则会发生编译时错误。