[英]When overloading constructors in Java
我想知道在Java中重載構造函數時是否需要初始化(調用)所有構造函數。
例如,
public class Dog {
int size = 0;
public Dog() {
size = 20;
}
public Dog(int size) {
this.size = size;
}
}
編輯:
我知道,當用戶調用不帶任何參數的構造函數時,將調用public Dog()。 如果我不初始化一個類中的所有構造函數,會不會有編譯錯誤?
當我創建Dog d = new Dog()時; 它將自動調用public Dog()。 但是,我還需要聲明Dog d = new Dog(40)嗎?
我認為如果需要初始化兩個Dog構造函數都沒有意義,但是我想知道其他示例中是否會出現問題。
我想知道是否需要在一個類中調用所有構造函數。
如果我不初始化一個類中的所有構造函數,會不會有編譯錯誤?
沒有。
您不必調用所有構造函數。 如果您編寫構造函數或方法,然后不在應用程序中的任何位置使用它,則不會出現編譯錯誤1 。
如果您不需要該類的任何實例,則甚至不必調用任何構造函數。 (並且在Java編碼模式中,不需要實例化某個特定類……)。
1-但是,自動樣式檢查器/錯誤檢查器或標記/檢查代碼的人員可能會注意到多余的構造函數和方法,並為此“ ping”您。
重載構造函數應采用這種方式: 它為您提供了一種從不同輸入集中構造相同對象的方法。 這是關於構造函數的重要規則:
重載構造函數時,傳遞給每個構造函數的參數足以完全指定和構造目標對象(按其合同要求)很重要。
只要沒有異常,調用構造函數總是返回一個對象。 您無法在已實例化的對象上調用第二個構造函數...,因為它已經被構造。
例如,考慮以下類:
public class Pair {
private final int x
private final int y
public Pair() {
this(0, 0);
}
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
public Pair(MyDoublet dbl) {
this.x = dbl.getX();
this.y = dbl.getY();
}
:
:
}
有三個構造函數。 調用其中任何一個都會產生一個完全指定的Pair對象。 實際上,如果構造函數未完全指定Pair對象,則編譯器將發出錯誤,因為對於Pair類,所有實例字段都是最終的,必須在構造函數中指定。
Pair p1 = new Pair(); // p1 has x=0, y=0
Pair p2 = new Pair(1, 3); // p2 has x=1, y=3
Pair p3 = new Pair(0, 0); // p3 is the same has p1 even though a
// different constructor was used.
TLDR:重載構造函數使您可以指定同一類中具有不同輸入集的對象的構造。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.