摘要:Java語言中的構(gòu)造方法是創(chuàng)建對象和初始化對象的特殊方法,因此,正確調(diào)用構(gòu)造方法是我們設(shè)計(jì)程序的關(guān)鍵所在,我們必須正確理解其調(diào)用原則和方式。
關(guān)鍵詞:構(gòu)造方法;調(diào)用
Java語言是面向?qū)ο蟮某绦蛟O(shè)計(jì)語言。Java程序在運(yùn)行時(shí),就是類中的若干個(gè)對象彼此交互、彼此發(fā)送消息的過程,所以在Java程序中需要給類創(chuàng)建所需的對象。而Java語言中的構(gòu)造方法就是專門用于創(chuàng)建對象和對所創(chuàng)建的對象進(jìn)行初始化的方法,所以,正確調(diào)用構(gòu)造方法是我們設(shè)計(jì)程序的關(guān)鍵所在。同時(shí),它也是一種特殊的成員方法,在定義時(shí)要求方法名必須與定義的類名完全相同;不允許給構(gòu)造方法指定返回類型,沒有void,也不能給構(gòu)造方法指定返回值;構(gòu)造方法不能被子類繼承;構(gòu)造方法在使用new語句進(jìn)行對象實(shí)例化時(shí)自動調(diào)用。
以下筆者就對構(gòu)造方法的調(diào)用方式進(jìn)行分析。Java語言中構(gòu)造方法的調(diào)用有三種方式。
一、在程序中通過new語句調(diào)用
當(dāng)我們定義的類沒有繼承其它類時(shí),直接通過new語句來調(diào)用當(dāng)前類的構(gòu)造方法來創(chuàng)建對象。
1.無繼承類的構(gòu)造方法的調(diào)用
例如:有以下類的定義:
public class Son {
…
public static void main(String[] args){
Son s=new Son();//調(diào)用默認(rèn)的無參構(gòu)造方法創(chuàng)建對象s
… } }
Son類沒有父類,也沒有顯示定義構(gòu)造方法,所以調(diào)用默認(rèn)的無參構(gòu)造方法來創(chuàng)建對象s。如果在類Son中顯示定義了一個(gè)或多個(gè)帶參數(shù)的構(gòu)造方法,創(chuàng)建對象時(shí)Java編譯器會根據(jù)創(chuàng)建的對象語句中的參數(shù)的個(gè)數(shù)、類型、順序來選擇相應(yīng)的構(gòu)造方法,完成不同對象的初始化工作。
2.隱式調(diào)用父類的無參構(gòu)造方法
當(dāng)一個(gè)子類繼承父類時(shí),子類的構(gòu)造過程中必須調(diào)用父類的構(gòu)造方法。特別是當(dāng)子類沒有定義構(gòu)造方法時(shí), 系統(tǒng)自動調(diào)用父類的無參構(gòu)造方法。例如,有以下定義:
class Father
{…}
public class Son extends Father
{…
public static void main(String[] args)
{ Son s=new Son();
//調(diào)用父類的無參構(gòu)造方法Father( )創(chuàng)建對象s
… } }
在上例中,由于沒有定義Son類(子類)的構(gòu)造方法,語句Son s=new Son()自動調(diào)用Father類(父類)的無參數(shù)的Father()構(gòu)造方法,完成對象的創(chuàng)建。所以此時(shí)必須要保證父類中有無參構(gòu)造方法,如果當(dāng)父類中的顯示定義了帶參數(shù)的構(gòu)造方法時(shí),就必須要顯示定義無參數(shù)的構(gòu)造方法,以確保父類中無參構(gòu)造方法存在,否則就會出現(xiàn)編譯錯(cuò)誤。即進(jìn)行如下操作:
class Father
{ …
public Father(String t){…}//帶參數(shù)的構(gòu)造方法
public Father( ){…} //無參數(shù)的構(gòu)造方法,此時(shí)必須顯示定義。
}public class Son extends Father
{ …
public static void main(String[] args)
{ Son s=new Son();
//調(diào)用父類的無參構(gòu)造方法Father( )創(chuàng)建對象s
… } }
二、通過super調(diào)用父類的構(gòu)造方法
在上述實(shí)例中,一般是子類和父類都沒有定義構(gòu)造方法,或者是子類沒有定義構(gòu)造方法。父類既顯式定義了帶參數(shù)的構(gòu)造方法,又顯式定義了無參數(shù)的構(gòu)造方法,那么子類一般隱式調(diào)用父類無參構(gòu)造方法。但在實(shí)際應(yīng)用中,大多數(shù)類都是顯式地定義了構(gòu)造方法。當(dāng)父類和子類都定義了構(gòu)造方法時(shí),如果父類的構(gòu)造方法初始化父類定義的成員,子類的構(gòu)造方法初始化子類定義的成員,在創(chuàng)建子類的對象時(shí),這兩個(gè)構(gòu)造方法都要執(zhí)行。這種情況下,必須在子類的構(gòu)造方法中使用關(guān)鍵字super來調(diào)用父類的構(gòu)造方法。
例如:
class Father
{ …
public Father(String t){…}//帶參數(shù)的構(gòu)造方法}
public class Son extends Father
{ …
public Son(int a)
{ super(“ab”);//調(diào)用父類Father的構(gòu)造方法
… }
public static void main(String[] args)
{
Son s=new Son();//調(diào)用子類的構(gòu)造方法創(chuàng)建對象s
… } }
如果子類通過super語句來調(diào)用父類的構(gòu)造方法時(shí),它必須作為子類構(gòu)造方法的第一條語句,而且super所帶的實(shí)際參數(shù)列表中的參數(shù)個(gè)數(shù)、類型、排列順序與父類構(gòu)造方法定義中的形式參數(shù)必須一致。
三、用this語句調(diào)用當(dāng)前類的其他構(gòu)造方法
當(dāng)子類調(diào)用父類的構(gòu)造方法時(shí)可以用super語句來完成,但是如果在同一個(gè)類中的構(gòu)造方法需要相互調(diào)用時(shí)我們?nèi)绾蝸斫鉀Q?this語句可以完成此功能。例如:
public class Father
{ …
public Father(String t)
{ …}
public Father( )
{ this(“ab”); //調(diào)用當(dāng)前Father類中帶參數(shù)的構(gòu)造方法
… }
public static void main(String[] args)
{ Father f=new Father ();
… } }
當(dāng)用this語句來調(diào)用同一個(gè)類中其他構(gòu)造方法時(shí),必須作為當(dāng)前構(gòu)造方法的第一條語句。只能在一個(gè)構(gòu)造方法中用this語句來調(diào)用類的其他構(gòu)造方法,而且this所帶的實(shí)際參數(shù)列表中的參數(shù)個(gè)數(shù)、類型、排列順序與所調(diào)用的構(gòu)造方法的形式參數(shù)必須一致。
構(gòu)造方法的調(diào)用是Java程序設(shè)計(jì)中最重要、最基本的操作,因此我們一定要正確理解其調(diào)用方式和原則。
參考文獻(xiàn)
[1] 劉志成,張杰. Java進(jìn)階教程 [M] .北京:機(jī)械工業(yè)出版社,2009.
[2] 錢銀中. Java程序設(shè)計(jì)案例教程[M] .北京:機(jī)械工業(yè)出版社,2008.