2014-03-31 50 views
0

就拿這段代碼,例如:Java中的最後一個變量不能再修改到什麼時候?

private final House house; 

public static void main(String[] args) 
{ 
    house = new House("Robinsons"); 
    house.setColor("Red"); 
} 

這會是最終的變數的有效使用?一旦它在技術上已經初始化,但仍然在構造函數中進行修改,修改它是否合法?

+3

請把這些代碼到一個IDE或'.java'文件,並嘗試編譯它... –

+0

'非靜態變量不能從靜態context' – nachokk

回答

2

final上的變量表示該變量在第一次分配後不能被重新分配。

假設您的代碼編譯,這

house = new House("Robinsons"); 

是一個賦值,所以house將被指定爲第一次。

house.setColor("Red"); 

是一個方法調用不影響變量house。它會影響由變量house引用的對象。

+0

所以在任何引用點代碼,對最終變量的那種操作是有效的? – SaxSalute

+0

@SaxSalute如果操作_的_kind是指方法調用或字段訪問,那麼是的,只要該變量已經在代碼中的該點明確初始化。 –

+0

@SaxSalute final意味着你不能再次將變量重新分配給一個新的對象,但如果它們在你的上下文中可見,你可以調用方法或字段訪問 – nachokk

0

我假設你遺漏了一些,這是完整的代碼?

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 
    } 
} 

如果是這樣,這裏有一些問題。

  1. 最終變量需要在聲明時賦予一個值。並回答你的問題, 一旦最後一個變量被賦予一個值(當聲明它的時候),這將是你最後一次修改它的時間。 (參考下面的評論,感謝exception1!)。
  2. 房屋不是一個靜態變量,所以它不能從main方法中訪問,要麼使house成爲一個靜態變量,我不建議這樣做。或者在使用之前在main方法中聲明一個實例。
+1

*最終變量需要在聲明時賦予一個值。從技術上講,對於Java 1.0來說這是事實。自Java 1.1以來,您可以使用** blank final **變量,請參閱https://en.wikipedia.org/wiki/Final_%28Java%29#Blank_final – exception1

+0

哎呀!你是對的!謝謝! – tambykojak

0

JLS §8.1.3

空白最終實例變量必須被明確賦值(§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.

相關問題