2013-08-26 173 views
6

我對Java非常陌生,並且試圖學習這個主題,因爲之前的程序設計暴露在HTML/CSS中。我已經開始與赫伯特Schildt並通過幾頁進展。構造函數重載的優點

我無法理解構造函數重載的確切優點。使用單個構造函數重載方法來實現靈活性不是更容易嗎?此外,如果我試圖使用構造函數重載來使用一個對象來初始化另一個對象,那麼有更簡單的方法來做到這一點!那麼,我應該使用構造函數重載的好處是什麼?

+0

很好的問題! –

+0

談到Java時,Schildt的聲譽有什麼好處?我記得當他試圖編寫有關C和C++的書籍時,他基本上是一個笑柄... – cHao

+0

Schildt的Java書很好..不知道C和C++的書。這本Java書從非常基礎的開始。因此,對於OOP和Java新手來說,這真的很有啓發。 –

回答

5

構造超載是用於模擬的默認值是非常有用的,或從一個已經存在的實例(複製)構造一個對象
下面是一個例子:

public class Color { 

    public int R, G, B, A; 

    // base ctr 
    public Color(int R, int G, int B, int A) { 
     this.R = R; 
     this.G = G; 
     this.B = B; 
     this.A = A; 
    } 

    // base, default alpha=255 (opaque) 
    public Color(int R, int G, int B) { 
     this(R, G, B, 255); 
    } 

    // ctr from double values 
    public Color(double R, double G, double B, double A) { 
     this((int) (R * 255), (int) (G * 255), (int) (B * 255), (int) (A * 255)); 
    } 

    // copy ctr 
    public Color(Color c) { 
     this(c.R, c.G, c.B, c.A); 
    } 

} 

這裏,第一構造非常簡單。您指定顏色的R,G,B & Alpha值。

雖然這足以使用Color類,但您提供了第二個構造函數liter,如果未由用戶指定,它會自動將255賦值給alpha。

第三個ctr顯示你可以在0和1之間實例化你的Color對象,而不是整數。

最後一個將Color作爲唯一參數,它複製給定的對象。

好處還在於第一個構造函數總是被調用的,您可以使用它手動計算您的實例。讓說你有一個private static int count=0屬性,你可以跟蹤Color實例的數量是這樣的:

// base ctr 
    public Color(int R, int G, int B, int A) { 
     this.R = R; 
     this.G = G; 
     this.B = B; 
     this.A = A; 
     ++count; 
    } 

count從任何構造函數遞增。

0

當你正在處理immutable classes,你想提供多種方式來實例化它們,那麼重載構造函數很方便。

+1

你可以用多個工廠方法來委託給一個構造函數。但這可能會作弊;-) –

1

它完全取決於你如何構建你的對象。

構造函數重載的經典示例之一是Java中的ArrayList。 ArrayList有三個構造函數,一個是空的,另一個是一個集合對象,一個是初始容量。這些重載構造函數允許靈活性創建數組列表對象。在創建過程中,你可能不知道arraylist的大小,你可以簡單地使用默認的無參數構造函數,但如果你知道大小,那麼最好使用帶有容量的重載構造函數。由於ArrayList也可以從另一個Collection創建,因此可能來自另一個List,而不是另一個重載的構造函數。通過使用重載的構造函數,可以將ArrayList轉換爲Set或任何其他集合。

More info帶有一般示例。

1

構造函數的定義方式將確保構造函數的參數在實例化時傳遞給對象。

重載方法不會「強制」任何人調用它,而不像在構造函數中有參數那樣,你不能在不傳遞這些參數的情況下實例化一個對象。

在ndj的答案中,可以用四種不同的方法創建多種方法來構造一個對象,例如Color類。每種方法都確保Color作爲有用的最小信息或「工作」。

這些信息可以和失蹤如果Color只有無參數構造器,爲類「工作」,將調用setR和其他方法......這不會在Color類存在。

0

您可能在一個類中有多個變量......但是您只想在創建對象時初始化少數(一個或兩個)變量。 因此,在這種情況下,總是有更好的重載構造函數,以便您可以調用各自的構造函數取決於您的要求。 有一件事你應該永遠記住,..重載構造函數總是提供一個默認的構造函數(零參數構造函數)。

+1

有沒有必要**總是**提供一個默認的構造函數。 – proskor

+0

它可能也不是**希望提供一個默認的構造函數。 –

+0

如果沒有默認構造函數..並且你的類被另一個類擴展..例如說ur類是A,它沒有默認構造函數。類B擴展A ...在創建類B的對象時如果你說B b = new B();那麼會發生什麼? – user2714918

2

考慮構造函數重載的最簡單的例子:

Class A 
{ 
int a; 

A() 
{ 
this.a = 0; 
} 

A(int a) 
{ 
this.a = a; 
} 

} // end class 

優勢:現在我可能只需要使用默認的構造函數new A()指定缺省值或更加動態的情況下,指定哪些價值必須是new A(10)這是一個參數化的構造函數。 do read this question

是不是更容易重載使用單個構造函數的靈活性?

構造函數的作用是實例化對象,該方法的工作是處理對象值。因此,限制的方法來處理(例外setter methods)和構造函數來創建對象將在長遠幫助,也使你的類更可用到你的隊友

而且,如果我想使用的構造函數重載使用一個 對象來初始化另一個,有更簡單的方法來做到這一點!

選擇是initializeralso read