我對Java非常陌生,並且試圖學習這個主題,因爲之前的程序設計暴露在HTML/CSS中。我已經開始與赫伯特Schildt並通過幾頁進展。構造函數重載的優點
我無法理解構造函數重載的確切優點。使用單個構造函數重載方法來實現靈活性不是更容易嗎?此外,如果我試圖使用構造函數重載來使用一個對象來初始化另一個對象,那麼有更簡單的方法來做到這一點!那麼,我應該使用構造函數重載的好處是什麼?
我對Java非常陌生,並且試圖學習這個主題,因爲之前的程序設計暴露在HTML/CSS中。我已經開始與赫伯特Schildt並通過幾頁進展。構造函數重載的優點
我無法理解構造函數重載的確切優點。使用單個構造函數重載方法來實現靈活性不是更容易嗎?此外,如果我試圖使用構造函數重載來使用一個對象來初始化另一個對象,那麼有更簡單的方法來做到這一點!那麼,我應該使用構造函數重載的好處是什麼?
構造超載是用於模擬的默認值是非常有用的,或從一個已經存在的實例(複製)構造一個對象
下面是一個例子:
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
從任何構造函數遞增。
它完全取決於你如何構建你的對象。
構造函數重載的經典示例之一是Java中的ArrayList。 ArrayList有三個構造函數,一個是空的,另一個是一個集合對象,一個是初始容量。這些重載構造函數允許靈活性創建數組列表對象。在創建過程中,你可能不知道arraylist的大小,你可以簡單地使用默認的無參數構造函數,但如果你知道大小,那麼最好使用帶有容量的重載構造函數。由於ArrayList也可以從另一個Collection創建,因此可能來自另一個List,而不是另一個重載的構造函數。通過使用重載的構造函數,可以將ArrayList轉換爲Set或任何其他集合。
More info帶有一般示例。
構造函數的定義方式將確保構造函數的參數在實例化時傳遞給對象。
重載方法不會「強制」任何人調用它,而不像在構造函數中有參數那樣,你不能在不傳遞這些參數的情況下實例化一個對象。
在ndj的答案中,可以用四種不同的方法創建多種方法來構造一個對象,例如Color
類。每種方法都確保Color
作爲有用的最小信息或「工作」。
這些信息可以和失蹤如果Color
只有無參數構造器,爲類「工作」,將調用setR
和其他方法......這不會在Color類存在。
您可能在一個類中有多個變量......但是您只想在創建對象時初始化少數(一個或兩個)變量。 因此,在這種情況下,總是有更好的重載構造函數,以便您可以調用各自的構造函數取決於您的要求。 有一件事你應該永遠記住,..重載構造函數總是提供一個默認的構造函數(零參數構造函數)。
有沒有必要**總是**提供一個默認的構造函數。 – proskor
它可能也不是**希望提供一個默認的構造函數。 –
如果沒有默認構造函數..並且你的類被另一個類擴展..例如說ur類是A,它沒有默認構造函數。類B擴展A ...在創建類B的對象時如果你說B b = new B();那麼會發生什麼? – user2714918
考慮構造函數重載的最簡單的例子:
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)和構造函數來創建對象將在長遠幫助,也使你的類更可用到你的隊友
而且,如果我想使用的構造函數重載使用一個 對象來初始化另一個,有更簡單的方法來做到這一點!
很好的問題! –
談到Java時,Schildt的聲譽有什麼好處?我記得當他試圖編寫有關C和C++的書籍時,他基本上是一個笑柄... – cHao
Schildt的Java書很好..不知道C和C++的書。這本Java書從非常基礎的開始。因此,對於OOP和Java新手來說,這真的很有啓發。 –