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

2018-01-18 15:39 更新

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


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

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

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

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

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

}

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

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

構(gòu)造函數(shù)名稱與類(lèi)的簡(jiǎn)單名稱相同。

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

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

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

public class Test {

  public Test() {
    // Code goes here

  }
}

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

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

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

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

以下語(yǔ)句使用Test類(lèi)的構(gòu)造函數(shù)來(lái)初始化Test類(lèi)的對(duì)象:

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è)類(lèi)可以有多個(gè)構(gòu)造函數(shù)。它們稱為重載構(gòu)造函數(shù)。

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

下面的代碼聲明兩個(gè)構(gòu)造函數(shù)。一個(gè)構(gòu)造函數(shù)不接受參數(shù),另一個(gè)接受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é)果。

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

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

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

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

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

下面的代碼使用語(yǔ)句“this(1);”從沒(méi)有參數(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è)構(gòu)造函數(shù),它必須是構(gòu)造函數(shù)體中的第一個(gè)可執(zhí)行語(yǔ)句。

構(gòu)造函數(shù)不能調(diào)用自身,因?yàn)樗鼘?dǎo)致遞歸調(diào)用。

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

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

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

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

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

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

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

構(gòu)造函數(shù)的訪問(wèn)級(jí)別修飾符

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

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

下面的代碼聲明了Test類(lèi)的四個(gè)構(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) {
  }
}

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

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

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

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

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

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

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

默認(rèn)構(gòu)造函數(shù)沒(méi)有任何參數(shù)。

默認(rèn)構(gòu)造函數(shù)也稱為無(wú)參數(shù)構(gòu)造函數(shù)。

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)