龍 軍
(??诮?jīng)濟(jì)學(xué)院 海南 ???570203)
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,多態(tài)指的是一個(gè)名詞可以有多個(gè)語義,Java 的多態(tài)性是通過繼承中的覆蓋(動態(tài)多態(tài)性)和方法的重載(靜態(tài)多態(tài)性)實(shí)現(xiàn)的。
Java 允許在一個(gè)類中有同名的多個(gè)方法存在,但要求參數(shù)列表不同,叫做方法重載。 這里的方法指具有相似功能的成員方法或構(gòu)造方法,不同的參數(shù)列表指的是方法的參數(shù)個(gè)數(shù)或參數(shù)的數(shù)據(jù)類型或?qū)?yīng)位置上的參數(shù)類型不同。 筆者通過下面的例子做一說明,首先做一個(gè)名叫ffcz 的類,在其中分別編寫幾個(gè)同名方法,再做一個(gè)名叫cz 的Application 類,在main 方法中生成ffcz 類的對象實(shí)例,依次調(diào)用成員方法并體現(xiàn)結(jié)果。
1.1.1 在類中聲明String 類型的成員變量mc。
1.1.2 編寫傳入一個(gè)字符串參數(shù)的方法,直接將傳入?yún)?shù)的值賦給成員變量。
1.1.3 編寫傳入字符串和整數(shù)兩個(gè)參數(shù)的方法,按第二個(gè)參數(shù)對第一個(gè)參數(shù)處理后賦給成員變量。
1.1.4 編寫傳入一個(gè)整數(shù)參數(shù)的方法,根據(jù)傳入?yún)?shù)的值給成員變量賦值。
1.1.5 編寫傳入兩個(gè)字符串參數(shù)的方法,將兩個(gè)參數(shù)連到一起賦給成員變量。
在main 方法中生成ffcz 類對象的實(shí)例,再調(diào)用各set_mc方法并體現(xiàn)成員變量mc。
結(jié)果表明Java 的編譯器會根據(jù)參數(shù)列表的不同來選擇具體調(diào)用的方法。
當(dāng)子類的成員變量和父類的成員變量同名時(shí),父類的成員變量被隱藏,如果是成員方法同名,父類的成員方法被覆蓋,也叫方法重寫。 重寫要求子類和父類有相同的方法名稱,且返回類型及參數(shù)列表也完全相同。 當(dāng)子類方法的訪問權(quán)限與父類的不同時(shí),要求子類方法的權(quán)限更大。 筆者通過構(gòu)建一個(gè)父類(ffcx)、一個(gè)子類(ffcx1)和一個(gè)Application 類(cx),在父類中編寫一個(gè)構(gòu)造方法和設(shè)置字符串的的方法,采用子類中無方法和重寫父類寫方法兩種形式,在cx 中體現(xiàn)結(jié)果。
2.1.1 編寫父類ffcx,在父類中聲明一字符串如mc,再編寫構(gòu)造方法給mc 賦初值,編寫set_mc 方法,將傳入的參數(shù)值賦給mc。
2.1.2 編寫空的子類ffcx1。
public class ffcx1 extends ffcx{ }
2.1.3 編寫Application 類cx,在main 方法中生成ffcx1 的對象實(shí)例,并體現(xiàn)出mc。
ffcx1 o1=new ffcx1();
System.out.println(o1.mc);
o1.set_mc("這是關(guān)于方法重寫的示例");
System.out.println(o1.mc);
2.1.4 運(yùn)行結(jié)果分析,運(yùn)行Application 類。
結(jié)果表明,雖然ffcx1 類體中沒有任何代碼,但父類中屬性和方法被子類繼承了。
2.2.1 在子類中重寫構(gòu)造方法和set_mc 方法,賦給mc 不同的值。
2.2.2 運(yùn)行結(jié)果分析,運(yùn)行Application 類。
結(jié)果表明,當(dāng)在子類中加入與父類同名的方法后,程序調(diào)用的是子類的方法,即子類重寫了父類的方法。
重載和重寫的方法名稱都相同,但重載要求參數(shù)列表不同,重寫要求參數(shù)列表完全相同。 重載是在一個(gè)類中,對方法前面的修飾符沒有限制,重寫是子類對父類方法重寫,對修飾符的使用有限制。
總之,Java 的多態(tài)性就是“一個(gè)接口,多種方法”。 通過重載和重寫,提高了程序的可讀性和可擴(kuò)展性,使類的結(jié)構(gòu)更加清晰、簡潔。
[1]胡書敏.Java 第一步[M].清華大學(xué)出版社,ISBN:7-302-18607-6.
[2]雍俊海.Visual C++大學(xué)教程[M].清華大學(xué)出版社,ISBN:7-302-12671-3.