2011-11-26 31 views
2

可能重複:
Should I initialize variable within constructor or outside constructorJava - 在哪裏啓動字段(實例變量)?

我這裏有關於如何在類初始化一個字段(實例變量)兩個例子。我的問題是:他們之間有什麼區別?哪一個最好,爲什麼?

例1:

public class Example1 { 
     private Object field; 
     public Example1() { 
      field = new Object(); 
     } 
    } 

例2:如果成員被初始化爲相同的值

public class Example2 { 
     private Object field = new Object(); 
     public Example2() { 
     } 
    } 

回答

4

您的第一個示例是在構造函數中初始化實例變量。

第二個例子是初始化他們當類本身被實例化,之前到的代碼在構造函數的執行,的任何代碼在超類構造執行之後。 (如果調用)

如果您有實例變量始終以相同的方式初始化,而不管調用哪個構造函數,那麼您應該使用第二種方法。如果實例變量的初始化取決於調用哪個構造函數,那麼第一種方法更好。例如:

public class Dog { 
    private int numLegs = 4; 
    private String name = "Fred"; 

    public Dog() { 
    } 

    public Dog(String name) { 
     this.name = name; 
    } 
} 

注意,在上面的例子中,你實際上可以同時使用 - 在構造函數初始化,你的對象實例化期間。

Dog myDog = new Dog(); // This dog's name is Fred 
Dog myDog = new Dog("Spot"); // This dog's name is Spot 
2

如果你有多個構造函數,那麼你可以試試這個規則,在線初始化它。否則,在構造函數中初始化它(真的)。

0

在實施例1:

field is initialized to null, C'tor is called, field is assigned to a reference of Object. C'tor completes.

在實施例2:

field will be initialized to a reference of Object. C'tor is called, C'tor completes.

Acc。對我來說,例2應該避免,直到它是一個靜態引用。

+0

這真的沒有考慮到Java中的變量是真正的引用,所以「初始化爲null」並不是那麼糟糕。在你的Ex 1中,第二次它應該是「'field'被賦予對象的引用」,並且在實例2中它應該被「'field」初始化爲對象的引用「... –

+0

注意到並且糾正。 – Azodious