如果我設置某個類的屬性的值並使用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