Java 構(gòu)造函數(shù)

2018-01-18 15:39 更新

Java面向?qū)ο笤O(shè)計 - Java構(gòu)造函數(shù)


構(gòu)造函數(shù)是用于在對象創(chuàng)建后立即初始化對象的代碼塊。

構(gòu)造函數(shù)的結(jié)構(gòu)看起來類似于一個方法。

聲明構(gòu)造函數(shù)

構(gòu)造函數(shù)聲明的一般語法是

<Modifiers> <Constructor Name>(<parameters list>) throws <Exceptions list> {

}

構(gòu)造函數(shù)的聲明以修飾符開頭。

構(gòu)造函數(shù)可以將其訪問修飾符作為public,private,protected或package-level(無修飾符)。

構(gòu)造函數(shù)名稱與類的簡單名稱相同。

構(gòu)造函數(shù)名稱后面是一對括號,可能包括參數(shù)。

可選地,右括號后面可以是關(guān)鍵字throws,其后面是逗號分隔的異常列表。

以下代碼顯示了聲明類Test的構(gòu)造函數(shù)的示例。類的名稱和構(gòu)造函數(shù)的名稱必須匹配。

public class Test {

  public Test() {
    // Code goes here

  }
}

與方法不同,構(gòu)造函數(shù)沒有返回類型。

使用構(gòu)造函數(shù)

我們使用一個帶有new操作符的構(gòu)造函數(shù)來在創(chuàng)建新實例之后初始化類的實例。

new運算符創(chuàng)建一個對象,構(gòu)造函數(shù)初始化該對象。

以下語句使用Test類的構(gòu)造函數(shù)來初始化Test類的對象:

Test t = new Test();

以下代碼顯示了如何使用構(gòu)造函數(shù)

class Cat {
  public Cat() {
    System.out.println("in constructor...");
  }
}

public class Main {
  public static void main(String[] args) {
    // Create a Cat object and ignore its reference
    new Cat();
    // Create another Cat object and store its reference in c
    Cat c = new Cat();
  }
}

上面的代碼生成以下結(jié)果。

重載構(gòu)造函數(shù)

一個類可以有多個構(gòu)造函數(shù)。它們稱為重載構(gòu)造函數(shù)。

如果一個類有多個構(gòu)造函數(shù),它們的數(shù)量,順序或參數(shù)類型都必須與其他構(gòu)造函數(shù)不同。

下面的代碼聲明兩個構(gòu)造函數(shù)。一個構(gòu)造函數(shù)不接受參數(shù),另一個接受String參數(shù)。

class Car {
  // Constructor #1
  public Car() {
    System.out.println("A car  is created.");
  }

  // Constructor #2
  public Car(String name) {
    System.out.println("A car  named " + name + "  is created.");
  }
}

public class Main {
  public static void main(String[] args) {
    Car d1 = new Car(); // Uses Constructor #1
    Car d2 = new Car("My Car"); // Uses Constructor #2
  }
}

上面的代碼生成以下結(jié)果。

每個對象創(chuàng)建表達式調(diào)用一次構(gòu)造函數(shù)。

我們可以在對象創(chuàng)建的過程中只執(zhí)行一個構(gòu)造函數(shù)的代碼一次。

從另一個構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)

構(gòu)造函數(shù)可以調(diào)用同一類的另一個構(gòu)造函數(shù)。讓我們考慮下面的Test類。它聲明兩個構(gòu)造函數(shù);一個不接受參數(shù),一個接受一個int參數(shù)。

我們必須使用關(guān)鍵字this從另一個構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)。

下面的代碼使用語句“this(1);”從沒有參數(shù)的構(gòu)造函數(shù)中調(diào)用具有int參數(shù)的構(gòu)造函數(shù)。

class Test {
  Test() {
    this(1); // OK. Note the use of the keyword this.
  }

  Test(int x) {
  }
}

如果構(gòu)造函數(shù)調(diào)用另一個構(gòu)造函數(shù),它必須是構(gòu)造函數(shù)體中的第一個可執(zhí)行語句。

構(gòu)造函數(shù)不能調(diào)用自身,因為它將導(dǎo)致遞歸調(diào)用。

從構(gòu)造函數(shù)返回

構(gòu)造函數(shù)在其聲明中不能有返回類型。

我們可以在構(gòu)造函數(shù)體中使用沒有返回表達式的return語句。

當(dāng)一個構(gòu)造函數(shù)中的返回語句被執(zhí)行時,控制返回給調(diào)用者,忽略構(gòu)造函數(shù)的其余代碼。

以下代碼顯示了在構(gòu)造函數(shù)中使用return語句的示例。

class Test {
  public Test(int x) {
    if (x < 0) {
      return;
    }

    System.out.println("here");
  }
}

構(gòu)造函數(shù)的訪問級別修飾符

構(gòu)造函數(shù)的訪問級別決定了可以在對象創(chuàng)建表達式中使用該構(gòu)造函數(shù)的程序。

我們可以為構(gòu)造函數(shù)指定四個訪問級別之一:public,private,protected和package-level。

下面的代碼聲明了Test類的四個構(gòu)造函數(shù)。

// Class Test   has  public access level 
public class Test {
  // Constructor #1 - Package-level access
  Test() {
  }

  // Constructor #2 - public access level
  public Test(int x) {
  }

  // Constructor #3 - private access level
  private Test(int x, int y) {
  }

  // Constructor #4 - protected access level
  protected Test(int x, int y, int z) {
  }
}

具有公共訪問級別的構(gòu)造函數(shù)可以在程序的任何部分中使用。

具有私有訪問級別的構(gòu)造函數(shù)只能在聲明它的同一類中使用。

具有受保護訪問級別的構(gòu)造函數(shù)可以在具有在其中聲明類的相同包的程序中以及在任何包中的任何后代類內(nèi)使用。

具有包級訪問權(quán)限的構(gòu)造函數(shù)可以在聲明其類的同一個包中使用。

默認構(gòu)造函數(shù)

具有包級訪問權(quán)限的構(gòu)造函數(shù)可以在聲明其類的同一個包中使用。

編譯器添加的構(gòu)造函數(shù)稱為默認構(gòu)造函數(shù)。

默認構(gòu)造函數(shù)沒有任何參數(shù)。

默認構(gòu)造函數(shù)也稱為無參數(shù)構(gòu)造函數(shù)。

如果類已經(jīng)有一個構(gòu)造函數(shù),編譯器不會添加任何構(gòu)造函數(shù)。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號