摘要:在JAVA語言中,構造方法占有重要和特殊的地位。該文從定義入手,通過實例對JAVA中構造方法的繼承和重載問題作了深入的探討,使讀者看后能對這部分知識有一個深刻的理解。
關鍵詞:JAVA語言;繼承;重載;this;super
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)21-6114-03
Discuss on Inheritance and Overloading of Construction Method in JAVA Language
YANG Xiao-lan, QIAN Cheng
(College of Information Engineering, Wuhan University of Science and Technology Zhongnan Branch, Wuhan 430223, China)
Abstract: Construction Method hasan important and special place in java language. based on the definitions, thearticle has carried on the deep discussion on the problem ofinheritanceandoverloading of construction methodin JAVAlanguageby example, after the reader to see this part of knowledge can have a profound understanding.
Key words: JAVA language; inheritance; overloading; this; super
在面向對象的程序設計中,一個類的構造方法用于創建對象時對對象的初始化。在說明了一個引用后,要調用new為新對象分配空間,也就是要調用構造方法。在JAVA語言中,使用構造方法是生成實例對象的唯一方法。鑒于構造方法在JAVA中的特殊地位,在用JAVA編程時,不可避免的要用到構造方法。很多初學者在JAVA構造方法的繼承和重載問題上感到有困難,甚至對構造方法是否能被繼承眾說不一,本文就JAVA語言中構造方法的繼承和重載問題作深入探討,希望能給讀者編程時帶來方便。
1 構造方法的重載
和類的其他成員方法可以重載一樣,類的構造方法也可以重載。構造方法的重載就是在同一個類中定義多個不同參數的構造方法,以適用于創建含有不同參數的對象時使用。這些構造方法或形參類型不同,或形參個數不同。例如:對于Student學生類,類中有兩數據成員name,score。可定義如下不同的構造方法來創建不同的學生對象。
Student(String s,double n);
Student(String s);
Student( );
當一個類中存在多個參數不同的構造方法,由類創建對象時,系統會自動根據對象實參的數目、類型和順序來確定調用哪一個構造方法來完成對新對象的初始化工作。例如:
Student s1=new Student(“王敏”, 91.5);//調用第一個構造方法
Student s2=new Student(“張亮”);//調用第二個構造方法
Student s3=new Student( );//調用第三個構造方法
同一個類中多個重載的構造方法也可以相互調用。當類中的一個構造方法需要調用另一個構造方法時,可以使用this( )關鍵字, this( )關鍵字根據需要可以帶參數,也可以不帶參數。該調用語句應該出現在構造方法的第一個可執行語句的位置上??慈缦聦嵗?
public class Student
{ String name;
double score;
public Student( String s, double n )
{ name=s; score=n;}
public Student( String s )
{this(s, 90.5); } //調用第一個構造方法
public Student( double n)
{this(“張立”); } //調用第二個構造方法
}
從上例可以看出:使用this()關鍵字調用同類的其他構造方法,其優點是提高對已有代碼的利用程度,減少代碼的重復書寫,從而提高程序的抽象程度。
2 構造方法的繼承
面向對象的程序設計語言的一個重要特點就是通過繼承而使代碼得到重用。我們知道JAVA中普通的成員方法可以被繼承,那么JAVA中的構造方法是否可以被繼承呢?對于這個問題,網絡上眾說紛紜,在這里,我們通過一些實例來說明構造方法的繼承問題。
實踐證明:子類可以繼承父類的構造方法,但應遵循以下的規則:
2.1 子類可以無條件地繼承父類的無參構造方法
如果子類需要用到無參構造方法,父類一定要有無參的構造方法給子類繼承。看下面的例1:
importjava.io.*;
class Sup_class
{ public Sup_class( intx)
{System.out.println(“我是父類中有參數的構造方法 !“+x); }
}
class Sub_class extends Sup_class
{ public Sub_class( )
{System.out.println(“我是子類的構造方法!”);}
}
public classMain_class
{ public static void main(String args[])
{ Sub_classm=new Sub_class( ); }
}
編譯該程序時,顯示如圖1所示結果。
從顯示結果可以看出:出現錯誤的原因是Sup_class類中缺少一個名為Sup_class()的構造方法。現在Sup_class類中增加一個無參的構造方法如下:
public Sup_class( )
{ System.out.println(“我是父類中無參的構造方法!”); }
再次編譯該程序,程序順利通過,結果如圖2所示。
當然,如果子類中不需要使用無參的構造方法,則父類也可以沒有無參的構造方法。
2.2 關于父類與子類構造方法的執行順序
如果子類自己沒有定義構造方法,則子類將繼承父類無參的構造方法作為自己的構造方法;如果子類自己定義了構造方法,則在子類創建新對象時,則先執行來自繼承父類的無參構造方法,再執行自己的構造方法。
在上述例1程序中,當在父類中增加了一個無參的構造方法:
public Sup_class( )
{ System.out.println(“我是父類中無參的構造方法!”); } 后,程序編譯正確,運行結果如圖2。從圖2顯示的運行結果可以看出:在主類中當執行Sub_classm=new Sub_class( );語句時,即創建子類的無參對象時,程序先調用來自繼承父類的無參構造方法Sup_class( ),得到結果“我是父類中無參的構造方法!”;再調用子類自己的構造方法Sub_class( ),得到結果“我是子類的構造方法!”。
2.3 對于有參的構造方法,子類可以通過在自身的構造方法中使用super( )來調用相應的構造方法
但這個調用語句只能出現在子類構造方法的第一個可執行語句。 具體應用見下面的例2。
3 構造方法繼承與重載的綜合舉例
例2:構造方法繼承與重載的綜合舉例如下:
class AA
{ public AA( )
{ System.out.println(“What’s your name?”); }
public AA(String s)
{this( );// 調用構造方法AA( )
System.out.println(“I am ”+s);
}
}
class BB extends AA
{ public static void main(String args[])
{BBb=new BB(“John”); }
public BB(String s)
{super(s); //調用父類的構造方法AA(String s)
System.out.println(“How are you?”);
}
public BB( )
{this(“I am Merry!”); }
}
該程序運行結果如圖3所示。
在該例中,父類AA中定義了兩個重載的構造方法AA( )和AA(String s),在構造方法AA(String s)中調用調用另一個構造方法AA ( )的語句是this( ),且必須出現在第一個可執行語句的位置上。
在子類BB中也定義兩個重載的構造方法BB( )和BB(String s)。在BB(String s)中通過語句super(s)調用父類的構造方法AA(String s),super(s)語句也必須出現在第一個可執行的位置上。
4 結束語
在JAVA語言中,構造方法占有非常重要和特殊的地位。在使用JAVA語言編寫程序時,不可避免的要用到JAVA構造方法重載和繼承的有關知識。對于一個用JAVA編程的程序員來說,熟練掌握有關JAVA構造方法的繼承和重載問題,是進行JAVA程序開發的一個必備的基本功。
參考文獻:
[1] 朱福喜.JAVA語言基礎教程[M].北京:清華大學出版社,2008.
[2] 趙海廷.Java語言程序設計[M].武漢:武漢大學出版社,2005.
[3] Eckel B.Java編程思想[M].侯捷,譯.北京:機械工業出版社,2002
[4] 李誠.Java2簡明教程[M].2版.北京:清華大學出版社,2004.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文