[英]Java and final initialization
我正在从.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"
}
}
您应该在类或构造函数中声明的地方初始化final字段。
构造函数中允许对最终字段进行初始化,因为在创建对象时,构造函数仅被调用一次。
当您在方法initializePaint()
对其进行initializePaint()
,您会得到编译器错误,因为此方法可以多次调用,并且最终变量/字段是常量,不能更改。 正如您将多次调用initializePaint()
方法一样,对final字段进行多次初始化是错误的。 因此,编译器将为此提供错误。
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"
}
}
因为initializePaint()方法可以在任何地方调用,而不仅仅是构造函数。 Java编译器希望确保最终变量在构造函数中仅分配一次。 因此,您必须将分配移至构造函数。
类的最终实例变量必须在构造函数的范围内实例化。 将Paint
对象的初始化移至构造函数,并在初始化方法中使用getter getPainter
。
BTW +1用于使用最终变量。 这是一个很好的编码实践。 IMO Java应该对变量使用'mutable'关键字,并将final作为默认值。
final
变量仅在减速时才初始化,也可以通过构造函数对其进行初始化。
例如:
class MyClass{
private final int intVar;
private final Paint paint;
public MyClass(){
intVar = 12;
paint= new Paint();
}
}
在您的代码中,您没有初始化最终变量。 此变量称为BLANK FINAL变量。 现在,您必须在构造函数中对其进行初始化。 否则,您会收到错误消息,因为变量的值将为null。
编译器看到您在构造函数上调用了initializePaint()
方法,但是看不到此方法将设置paint
变量。 您需要在构造函数中明确设置paint
字段,例如:
class MyClass{
private final int intVar; //ok
private final Paint paint; //error
public MyClass(){
intVar = 12;
paint= new Paint();
}
}
所有最终变量的初始化必须在构造函数中进行,而不是在构造函数的方法调用的调用层次结构中的任何地方进行(例如您的情况下的initializePaint()
)。
final
方法一旦分配,就无法重新分配,而需要在构造函数中进行分配。 所以你没有办法重新分配paint
编辑:一些阅读: http : //en.wikipedia.org/wiki/Final_(Java)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.