我正在从.NET转换为Java。我想知道为什么下面的代码不起作用
class MyClass{
private final int intVar; //ok
private final Paint paint; //error "Variable paint might not have been initialized"
public MyClass(){
intVar = 12;
initializePaint();
}
private void initializePaint(){
paint = new Paint(); //error "cannot assign a variable to final variable"
}
}
答案 0 :(得分:4)
您应该在类或构造函数中声明的位置初始化最终字段。
构造函数允许初始化final字段,因为构造函数在创建对象时只调用一次。
当您在方法initializePaint()
中初始化它时,您将收到编译器错误,因为此方法可以多次调用,并且最终变量/字段是常量且无法更改。正如您将多次调用initializePaint()
方法一样,多次初始化最终字段是错误的。因此编译器会给出错误。
class MyClass{
private final int intVar; //ok
private final Paint paint;// paint = new Paint(); to avoid //error "Variable paint might not have been initialized"
public MyClass(){
intVar = 12;
//initializePaint();
paint = new Paint(); // here initialized And allowed.
}
private void initializePaint(){
paint = new Paint(); //error "cannot assign a variable to final variable"
}
}
答案 1 :(得分:3)
因为可以从任何地方调用initializePaint()方法,而不仅仅是构造函数。 Java编译器希望确保在构造函数中仅为最终变量赋值一次。所以你必须将赋值移动到构造函数。
答案 2 :(得分:1)
必须在构造函数的范围内实例化类的最终实例变量。
将Paint
对象的初始化移动到构造函数,并在初始化方法中使用getter getPainter
。
使用最终变量的BTW +1。这是一个很好的编码实践。 IMO Java应该为变量设置一个'mutable'关键字,并将final作为默认值。
答案 3 :(得分:1)
final
变量仅在该变量减速时初始化,或者您也可以通过构造函数初始化它。
前:
class MyClass{
private final int intVar;
private final Paint paint;
public MyClass(){
intVar = 12;
paint= new Paint();
}
}
答案 4 :(得分:1)
在您的代码中,您没有初始化最终变量。这个变量叫做BLANK FINAL变量。现在你必须在构造函数中初始化它。否则你会得到错误,因为变量的值将为null。
答案 5 :(得分:0)
编译器看到你在构造函数上调用initializePaint()
方法,但不是这个方法会设置paint
变量。您需要在构造函数中明确设置paint
字段,如:
class MyClass{
private final int intVar; //ok
private final Paint paint; //error
public MyClass(){
intVar = 12;
paint= new Paint();
}
}
答案 6 :(得分:0)
所有final变量的初始化必须在构造函数中进行,而不是在构造函数的方法调用的调用层次结构中的某个位置(例如,在您的情况下为initializePaint()
)。
答案 7 :(得分:0)
final
表示一旦分配,就无法重新分配它,您需要在构造函数中分配它。
因此,您无法重新分配paint