2011-11-30 83 views
0

我最近碰到的一段代碼:Java非靜態字段默認值?

public class SomeClass 
{ 
    private Logger logger = LoggerFactory.getInstance().getLogger(SomeClass.class); 
    private int whatever; 

    // .. Rest of the class definition 
} 

,被風吹走!這段代碼編譯和運行非常漂亮!我只看到了在類變量(靜態)上執行的這種賦值。我的印象是,爲了給實例變量賦值,人們必須在方法內部這樣做。錯誤!

我的問題:這是一種覆蓋Java默認值類型的方法嗎?例如,在上面的示例中,1ogger字段通常會分配一個值null,直到由構造函數/設置器賦值。其他類型,如基元,都有其自己的內置默認值,如booleans,默認爲false

這只是讓你重寫內置默認值的Java方法嗎?否則,這是什麼,它爲什麼編譯?!?

在此先感謝!

回答

2

我看不出有什麼問題。聲明可以包含一個任務,這就是你正在做的 - 爲你的領域分配一個初始值。

您可以通過多種方式向字段提供初始值:通過構造函數,通過初始化塊({..})或直接賦值,就像您一樣。

查看本教程的Initializing Fields部分。

1

你不能爲一個類型更改默認值,但您可以寫信給實例變量中:

  • 域聲明:

    private int x = 10; 
    
  • 構造函數:

    private int x; 
    public Foo() { 
        x = 10; 
    } 
    
  • 實例初始值設定項:

    private int x; 
    
    void someOtherMethod() {} 
    
    // These are relatively rare 
    { 
        x = 10; 
    } 
    
  • 普通方法:

    private int x; 
    
    void someMethod() { 
        x = 10; 
    } 
    

見JLS的section 8.3.2.2更多關於初始化實例變量,以及在JLS的section 8.3現場申報的更一般的語法。

0

內置的默認值不能被覆蓋,int字段被初始化爲零。你無能爲力(除了自己將字段初始化爲其他值)