2009-04-22 49 views
0

見類定義的方法有兩種:何時加載類變量?

//definition: 1 
public class MyClass{ 

    private MyObject obj = new MyObject(); 
    private String str = "hello world"; 

    // constructor 
    public MyClass(){ 

    } 
} 

// definition: 2 
public class MyClass{ 

    private MyObject obj = null; 
    private String str = null; 

    // constructor 
    public MyClass(){ 
     obj = new MyClass(); 
     str = "HelloWorld"; 
    }  
} 

我的問題是:加載的類變量時。他們如何加載?

它們的初始化是如何發生的?如果它們的初始化可能發生在定義1中,那麼構造函數的目的是什麼?

哪個是定義類的首選方式,爲什麼? C++/C#/ Java中的行爲是否相同,或者它們的行爲有所不同?

歡迎對上述任何澄清意見。

+0

這ISN實際上不是語言不可知的,因爲它可能取決於語言,甚至取決於語言的特定實現。 – Avi 2009-04-22 14:00:29

回答

1

這取決於語言,但大多數語言在調用構造函數之前初始化字段。一般而言,我主張在上下文中進行處理,初始化通常只在聲明字段的地方使用。然而,正如約翰指出的那樣,有時候你需要做一些沒有道理的事情/是可能的。

此外,與往常一樣,如果您的字段依賴其他字段進行初始化,則順序非常重要。在有些語言,如動作腳本,這意味着該聲明的順序確定初始化順序:

作品:

public class Foo 
{ 
    private var bar:Array = [1, 2, 3]; 
    private var baz:Array = bar.concat([4, 5, 6]); 
} 

不起作用:

public class Foo 
{ 
    private var baz:Array = bar.concat([4, 5, 6]); 
    private var bar:Array = [1, 2, 3]; 
} 
0

構造函數是將類實例化爲對象時運行的第一個函數。

在實例化過程中初始化類變量,然後立即運行構造函數。

0

在大多數語言中,實例字段(它們不稱爲任何我知道的任何語言的類變量)將在實例構造期間被初始化。它們實際上是構造函數的一部分,在實際的構造函數代碼之前執行。

你當然可以用顯式的構造函數代碼初始化它們(儘管如果你想將它們設置爲其他東西,將自己的設置保存爲null)。

你問什麼是構造函數 - 你不能在初始化器中做所有事情。如果你需要循環或什麼?

+0

感謝John對於構造函數的回覆和好意。 – pankajt 2009-04-22 20:08:12