2012-04-21 125 views
11

我知道一旦最後一個變量賦值給它,它就不能被改變。不過我只是對本幾個問題:Java - 最終變量

  • 當我有一個場,說static final JButton button;一類外,然後在main方法,嘗試將它分配一個值,button = new JButton("OK");,我得到一個錯誤告訴我刪除最終修飾符?但是因爲原來的button變量還沒有引用一個對象,所以我在印象之下可以指定它一次?其次,如果我完全刪除對button的引用,所以我只有static final JButton button;以外的類,我的IDE聲稱「空白最終字段按鈕可能沒有被初始化。」這是否意味着所有最終字段必須被初始化?如果是這樣,他們必須在那裏初始化,然後我似乎不能在以後初始化它。

  • 此外,愚蠢的問題,但我最初的假設,當一個最終變量引用實例或數據類型,它不能被分配給其他任何東西是正確的,對嗎?

此代碼是不完整的,而是用來說明我的觀點:

public class FinalVarTester { 

    static final JButton button; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     button = new JButton("OK"); 
     container.add(button, BorderLayout.SOUTH); 
    } 

} 

回答

18

您應該在靜態初始化程序中或直接初始化靜態最終變量。因此,無論

static final JButton button = new JButton(); 

static final JButton button; 

static { 
    button = new JButton(); 
} 

Java語言規範有一些關於它的更多文檔:在section about final variables指定爲什麼你的編譯錯誤:

It is a compile-time error if a final variable is assigned to unless it is definitely unassigned (§16) immediately prior to the assignment.

chapter 16關於會談明確的分配

+0

是不是強制性的,在申報的時間進行初始化最後一個變量? – 2013-07-01 11:36:21

0

類範圍最終的變量必須在聲明中或在構造函數初始化。除非在主函數中聲明,否則不能在主函數中分配最終變量。所有最終字段都必須初始化。所有變量必須在使用前初始化。

3

final字段的確必須初始化,因爲這將是它們對於程序其餘部分的值。

一個例外是可以在構造函數中初始化一個final變量。由於靜態字段不屬於一個實例,所以它們必須被初始化(沒有構造函數)直接初始化,或者靜態初始化塊是做這些的選項。

關於你最後的問題,是的,這就是爲什麼它被稱爲final。

0

問題是機智h在類中的方法中初始化最終變量(main方法也是方法:))。在Java中,「final」就像常量,它可以初始化一次。用組合而不是聚合來完成。

public class FinalVarTester { 

    static final JButton button = new JButton("OK"); 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
    } 
} 
0

正確的答案是,static final var爲總是在類初始化時初始化 - 要麼你提供的值或默認值(NULL,0,假)。

0

最終變量只能通過初始化程序或賦值語句初始化一次。它不需要在聲明點初始化:這被稱爲「空白最終」變量。

最後變量

類型

1)INSTANCE最終變量:

一類的坯件最終實例變量必須在它被聲明的類的每一個構造的端部被明確賦值;否則,發生編譯時間錯誤

2)STATIC最終變量

空白最終靜態變量必須在它被聲明的類的靜態初始化程序被明確賦值;否則,會發生編譯時錯誤

在這兩種情況下,都是爲了避免在初始化之前使用最終變量。

所以在你的情況下,它必須通過靜態初始化塊進行初始化,當初始化類加載時進行初始化。

編號:http://en.wikipedia.org/wiki/Final_(Java)

0

更好的不錯作弄方式:

public class FinalVarTester 
{  
    static final JButton button; 
    public FinalVarTester() 
    {  
     JFrame frame = new JFrame(); 
     Container container = frame.getContentPane(); 
     container.setLayout(new BorderLayout()); 
     container.add(button, BorderLayout.SOUTH); 
     button = new JButton("OK"); 
    } 
    public static void main(String[] args)  
    { 
     FinalVarTester vTester = new FinalVarTester();  
    } 
}