簡體   English   中英

在Java中重載構造函數時

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM