如果我设置某个类的属性的值并使用final,那么是否必须将该属性初始化为类构造函数的参数?例如,我已经长度的属性齿条设置为60个使用已在构造函数中初始化的类的属性
public class Runs {
Teams team;
final int racklength=60;
int xposteam;
public Runs (Teams y) {
team=y;
}
}
如果我设置某个类的属性的值并使用final,那么是否必须将该属性初始化为类构造函数的参数?例如,我已经长度的属性齿条设置为60个使用已在构造函数中初始化的类的属性
public class Runs {
Teams team;
final int racklength=60;
int xposteam;
public Runs (Teams y) {
team=y;
}
}
你必须始终初始化final
属性,但你可以做到这一点无论是在地方(你首先声明它),或在其构造函数(或构造函数):
public class Runs {
Teams team;
final int racklength; // initialization postponed
int xposteam;
// constructor defaulting racklength to 60
public Runs (Teams y){
team=y;
racklength=60;
}
// constructor with variable initialization of final attribute
public Runs (int l, Teams y){
team=y;
racklength=l;
}
// error since racklength is not initialized during construction
public Runs(){
team=null
}
}
final
字段的值必须要么初始化内嵌或构造。
实施例:
class Foo {
final String bar = "bar";
Foo() {
}
}
或
class Foo {
final String bar;
Foo() {
bar = "bar";
}
}
是可接受的。
不,您可以在声明变量的位置初始化它。而且没有理由必须将变量与参数分配给构造函数。
*“并没有理由你必须分配变量的参数给构造函数。”* - 也许我读你错了,但是......呃?如果你定义了一个实例级别的常量(这是一个非静态的final),你可以通过一个构造函数参数来初始化它。否则,如果一个类的所有实例的实例级常量都具有相同的值,那么我们也可以使其保持不变。 – 2011-04-27 00:38:53
我同意。你的观点与我所说的不是相互排斥的。 – 2011-04-27 00:47:04
不,你不必这样做。
这两个工作正常。
public final class SomeClazz {
private final int test=10;
public SomeClazz(){
}
public int getTest() {
return test;
}
}
或者
public final class SomeClazz {
private final int test;
public SomeClazz(int test){
this.test = test;
}
public int getTest() {
return test;
}
}
然而,我更喜欢通过构造函数初始化它们,因为这样谁正在建设中的对象调用者知道如何与预期值创建对象的状态。如果它应该是一个常量类型的值,那么你应该使用Enums
,而不是用这种方法在你的班级中定义它们。
您可以缩进代码格式代码块由4个空格(或选择代码部分并单击编辑器中的{}按钮)。我为你做了这个,但你可能想编辑这个问题,并试着修改一下格式。 – 2011-04-27 00:30:02