在本教程中,您將在示例的幫助下了解Java構造函數(shù),如何創(chuàng)建和使用它們以及不同類型的構造函數(shù)。
在Java中,每個類都有它的構造函數(shù),當類的對象被創(chuàng)建時,該構造函數(shù)將被自動調(diào)用。構造函數(shù)類似于方法,但實際上它不是方法。
一個Java方法和Java構造函數(shù)以通過其名稱和返回類型進行區(qū)分。構造函數(shù)與類的構造函數(shù)同名,并且不返回任何值。例如,
class Test { Test() { //構造函數(shù)體 } }
在這里,Test()是一個構造函數(shù)。它具有與該類相同的名稱,并且沒有返回類型。
class Test { void Test() { // 方法主體 } }
這里,Test()與類的名稱相同。但是,它有一個返回類型void。因此,它是一個方法,而不是一個構造函數(shù)。
class Main { private int x; // 構造函數(shù)體 private Main(){ System.out.println("構造函數(shù)被調(diào)用"); x = 5; } public static void main(String[] args){ //創(chuàng)建對象時調(diào)用構造函數(shù) Main obj = new Main(); System.out.println("x 的值 = " + obj.x); } }
輸出:
構造函數(shù)被調(diào)用 x 的值 = 5
在上面的示例中,我們有一個名為Main()的私有構造函數(shù)。在main方法中,我們正在創(chuàng)建一個名為obj的類對象。
Main obj = new Main();
在此過程中,將調(diào)用構造函數(shù)。因此,執(zhí)行print語句并初始化變量x。
在Java中,構造函數(shù)可以分為3種類型:
無參數(shù)構造函數(shù)
默認構造函數(shù)
參數(shù)構造函數(shù)
Java構造函數(shù)可以具有或可以不具有任何參數(shù)。如果構造函數(shù)不接受任何參數(shù),則稱為無參數(shù)構造函數(shù)。例如,
private Constructor() { // 構造函數(shù)體 }
class Main { int i; //沒有參數(shù)的構造函數(shù) private Main(){ i = 5; System.out.println("Object created and i = " + i); } public static void main(String[] args) { //不帶任何參數(shù)調(diào)用構造函數(shù) Main obj = new Main(); } }
輸出:
Object created and i = 5
在這里,構造Main()函數(shù)不接受任何參數(shù)。
您是否注意到Main()構造函數(shù)的訪問修飾符是私有(private)的?
這是因為該對象是從同一類中實例化的。因此,它可以訪問構造函數(shù)。
但是,如果對象是在類外部創(chuàng)建的,則必須聲明構造函數(shù)為public才能訪問它。例如:
class Company { String domainName; // 公共構造函數(shù) public Company(){ domainName = "(cainiaoplus.com)"; } } public class Main { public static void main(String[] args) { // 在另一個類中創(chuàng)建對象 Company companyObj = new Company(); System.out.println("Domain name = "+ companyObj.domainName); } }
輸出:
Domain name = (cainiaoplus.com)
相關閱讀: Java訪問修飾符
如果不創(chuàng)建任何構造函數(shù),則Java編譯器將在運行時自動創(chuàng)建無參數(shù)的構造函數(shù)。此構造函數(shù)稱為默認構造函數(shù)。默認構造函數(shù)使用默認值初始化所有未初始化的實例變量。
類型 | 默認值 |
---|---|
boolean | false |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
char | \u0000 |
float | 0.0f |
double | 0.0d |
object | null |
class DefaultConstructor { int a; boolean b; public static void main(String[] args) { //調(diào)用默認構造函數(shù) DefaultConstructor obj = new DefaultConstructor(); System.out.println("a = " + obj.a); System.out.println("b = " + obj.b); } }
輸出:
a = 0 b = false
在上面的程序中,我們還沒有初始化變量a和b的值。但是,當我們創(chuàng)建類的對象時,我們可以在輸出中看到這些值已使用某些值進行了初始化。
這是因為Java編譯器自動創(chuàng)建了一個默認構造函數(shù)。構造函數(shù)將使用默認值0和false初始化變量a和b的值。
上面的程序等同于:
class DefaultConstructor { int a; boolean b; //私有構造函數(shù) private DefaultConstructor() { a = 0; b = false; } public static void main(String[] args) { //調(diào)用構造函數(shù) DefaultConstructor obj = new DefaultConstructor(); System.out.println("a = " + obj.a); System.out.println("b = " + obj.b); } }
輸出:
a = 0 b = false
與方法類似,我們可以將參數(shù)傳遞給構造函數(shù)。此類構造函數(shù)稱為參數(shù)化構造函數(shù)。例如,
private Constructor (arg1, arg2, ..., argn) { // 構造函數(shù)體 }
class Vehicle { int wheels; //接受單個值的構造函數(shù) private Vehicle(int wheels){ this.wheels = wheels; System.out.println(wheels + " wheeler vehicle created."); } public static void main(String[] args) { //通過傳遞單個值來調(diào)用構造函數(shù) Vehicle v1 = new Vehicle(2); Vehicle v2 = new Vehicle(3); Vehicle v3 = new Vehicle(4); } }
輸出:
2 wheeler vehicle created. 3 wheeler vehicle created. 4 wheeler vehicle created.
在上面的示例中,我們有一個名為Vehicle()的構造函數(shù)。構造函數(shù)接受一個名為wheels的參數(shù)。
在這里,當創(chuàng)建對象時,我們將參數(shù)傳遞給構造函數(shù)。并且,基于參數(shù),它正在生成輸出。
與方法重載類似,我們也可以在Java中重載構造函數(shù)。如果您不熟悉方法重載,請訪問Java方法重載。
在構造函數(shù)重載中,有兩個或多個具有不同參數(shù)的構造函數(shù)。例如,
class Company { String domainName; //沒有參數(shù)的構造函數(shù) public Company(){ this.domainName = "default"; } //具有單個參數(shù)的構造函數(shù) public Company(String domainName){ this.domainName = domainName; } public void getName(){ System.out.println(this.domainName); } public static void main(String[] args) { //不帶參數(shù)調(diào)用構造函數(shù) Company defaultObj = new Company(); //使用單個參數(shù)調(diào)用構造函數(shù) Company nhoooObj = new Company("(cainiaoplus.com)"); defaultObj.getName(); nhoooObj.getName(); } }
輸出:
default (cainiaoplus.com)
在上面的示例中,我們有兩個構造函數(shù):public Company()和public Company(String domainName)。
在這里,兩個構造函數(shù)都用不同的值初始化變量domainName。因此,根據(jù)我們需要的值,我們可以從main()方法調(diào)用構造函數(shù)。
注意,我們使用this關鍵字來指定類的變量。要了解有關this關鍵字的更多信息,請訪問Java this關鍵字。
構造函數(shù)在實例化對象時被隱式調(diào)用。
創(chuàng)建構造函數(shù)的兩個規(guī)則是:
構造函數(shù)的名稱應與類的名稱相同。
Java構造函數(shù)不得具有返回類型。
如果類沒有構造函數(shù),則Java編譯器會在運行時自動創(chuàng)建默認構造函數(shù)。默認構造函數(shù)使用默認值初始化實例變量。例如,int變量將被初始化為0
構造函數(shù)類型:
無參數(shù)構造函數(shù) - 不接受任何參數(shù)的構造函數(shù)
默認構造函數(shù) - 如果沒有顯式定義,Java編譯器會自動創(chuàng)建一個構造函數(shù)。
參數(shù)化構造函數(shù) - 接受參數(shù)的構造函數(shù)
構造函數(shù)不能是抽象的abstract 、static或final。
構造函數(shù)可以重載,但不能被重寫。