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