4 回答

TA貢獻1900條經驗 獲得超5個贊
使用起來方便多了。
如果你有一個簡單的構造函數,例如:
public Fraction(int n, int d) { num = n; denom = d; }
您可以使用以下代碼復制實例原始:
Fraction copy = new Fraction(original.num, original.denom);
使用復制構造函數時,您執行以下調用:
Fraction copy = new Fraction(original);
如果您有很多參數,這會更方便。當您更改構造函數或對象的參數時會發生什么?如果沒有復制構造函數,您必須更改所有此類調用。
M. Prokhorov 的評論中值得注意的事實:
復制構造函數沒有特殊的語法,它們只是實現參數化構造函數的邏輯樣式。

TA貢獻1856條經驗 獲得超11個贊
如果你只是簡單地輸入
public Fraction(Fraction other) {
}
Java 不會簡單地猜測您想要將 的值復制other到新對象中。Java 不會像這樣自動為你初始化變量。為了使其成為復制構造函數,您仍然需要手動鍵入將字段復制到other您正在創建的對象的代碼。像這樣:
public Fraction(Fraction other) {
num = other.num;
denom = other.denom;
}
構造函數創建一個新的Fraction,但您在其中鍵入的代碼手動執行“復制”,使其成為“復制構造函數”并允許您執行以下操作
Fraction a = Fraction(4, 20);
Fraction b = new Fraction(a);
// b has the same values as a but is a different object
當然,如果您已經有另一個構造函數,則創建復制構造函數的更短方法是
public Fraction(int n, int d) {
num = n;
denom = d;
}
public Fraction(Fraction other) {
this(other.num, other.denom);
}

TA貢獻1828條經驗 獲得超13個贊
如果您有一個對象實例,例如Fraction
:
Fraction?fr?=?new?Fraction(1,?2);?//represents?1/2
當然,您可以通過將其分配給新變量來復制它:
Fraction?copy?=?fr;
但現在, 和fr
都copy
指向同一個對象(內存中的同一位置)。如果由于某種原因copy
改變為1/3,fr
也會改變。有時您想要原始對象的全新副本。這就是寫起來非常方便的地方:
Fraction?copy?=?new?Fraction(fr);
現在您可以獨立操作copy
,而fr
不必擔心其中任何一個發生不必要的更改。

TA貢獻1829條經驗 獲得超6個贊
使用復制構造函數而不是傳遞所有參數的構造函數有兩個很好的理由:
當我們有一個具有許多屬性的復雜對象時,使用復制構造函數很方便
如果我們向現有類添加一個屬性,那么我們只需更改復制構造函數以考慮此新屬性,而不是更改其他構造函數的每次出現
添加回答
舉報