就拿這段代碼,例如:Java中的最後一個變量不能再修改到什麼時候?
private final House house;
public static void main(String[] args)
{
house = new House("Robinsons");
house.setColor("Red");
}
這會是最終的變數的有效使用?一旦它在技術上已經初始化,但仍然在構造函數中進行修改,修改它是否合法?
就拿這段代碼,例如:Java中的最後一個變量不能再修改到什麼時候?
private final House house;
public static void main(String[] args)
{
house = new House("Robinsons");
house.setColor("Red");
}
這會是最終的變數的有效使用?一旦它在技術上已經初始化,但仍然在構造函數中進行修改,修改它是否合法?
final
上的變量表示該變量在第一次分配後不能被重新分配。
假設您的代碼編譯,這
house = new House("Robinsons");
是一個賦值,所以house
將被指定爲第一次。
這
house.setColor("Red");
是一個方法調用不影響變量house
。它會影響由變量house
引用的對象。
我假設你遺漏了一些,這是完整的代碼?
public class House {
private final House house;
public static void main(String[] args)
{
house = new House("Robinsons");
house.setColor("Red");
}
public House(String houseName) {
// do something
}
public void setColor(String color) {
// do something
}
}
如果是這樣,這裏有一些問題。
main
方法中訪問,要麼使house
成爲一個靜態變量,我不建議這樣做。或者在使用之前在main
方法中聲明一個實例。*最終變量需要在聲明時賦予一個值。從技術上講,對於Java 1.0來說這是事實。自Java 1.1以來,您可以使用** blank final **變量,請參閱https://en.wikipedia.org/wiki/Final_%28Java%29#Blank_final – exception1
哎呀!你是對的!謝謝! – tambykojak
空白最終實例變量必須被明確賦值(§16.9)在每個構造的端部(§8.8),其中它被聲明的類的;否則會發生編譯時錯誤。
實際上,這意味着,你的對象被創建後,無論是與自己的自定義構造函數或默認的無參數的構造函數,你final
可變必須被分配一個值。
就目前而言,這不是final
的有效使用;缺省的無參數構造函數在構造過程中不能爲其分配值。
稍微更合適的用法是這樣的:
public class PersonsHome {
private final House house;
public PersonsHome(String houseName) {
house = new House(housename);
}
}
house
在施工年底肯定是分配,所以final
合同成立。
1:我提到了默認的無參數構造函數;那唯一的創建if there's no other constructor around.
請把這些代碼到一個IDE或'.java'文件,並嘗試編譯它... –
'非靜態變量不能從靜態context' – nachokk