李娜
摘 要
面向?qū)ο缶幊逃腥筇匦裕悍庋b、繼承、多態(tài),本文主要談?wù)勂渲兄欢鄳B(tài)的兩種實(shí)現(xiàn)方式——方法重載與方法覆蓋,并比較它們的異同。
【關(guān)鍵詞】Java 多態(tài) 方法重載 方法覆蓋
在Java語(yǔ)言的學(xué)習(xí)過(guò)程中,初學(xué)者經(jīng)常分不清重載與覆蓋,實(shí)際上,方法重載(Overload)和方法覆蓋(Override,也叫重寫)都是Java多態(tài)性的體現(xiàn),只是形式不同,在此,筆者簡(jiǎn)單地談一談兩者的異同。
1 方法重載與方法覆蓋的特點(diǎn)
1.1 方法重載的特點(diǎn)
Java語(yǔ)言中的方法重載就是在類中可以創(chuàng)建多個(gè)方法,實(shí)際上就是一個(gè)類中多態(tài)性的一種表現(xiàn),也叫靜態(tài)多態(tài)。
如下面的例子:
1 class DBUtil{
2 private String server="127.0.0.1";//服務(wù)器地址
3 private String db="HRDB";//數(shù)據(jù)庫(kù)名稱
4 public String getDBUrl(String server,String db){//重載方法
5 return "jdbc:sqlserver://"+server+":1433; DatabaseName="+db;
6 }
7 public String getDBUrl(String server){ //重載方法
8 return getDBUrl(server,db);
9 }
10 public String getDBUrl(){//重載方法
11 return getDBUrl(server,db);
12 }
13 }
14 public class StaticPolymorphismDemo {
15 public static void main(String args[]) {
16 DBUtil util=new DBUtil();
17 //調(diào)用第4行的方法
18 System.out.println(util.getDBUrl("192.168.4.23","CXHR"));
19 //調(diào)用第7行的方法
20 System.out.println(util.getDBUrl("192.168.4.23"));
21 //調(diào)用第10行的方法
22 System.out.println(util.getDBUrl());
23 }
24 }
方法重載的主要特點(diǎn)有以下幾點(diǎn):第一個(gè)特點(diǎn)是方法名是相同的;第二個(gè)特點(diǎn)是方法的個(gè)數(shù)、順序、參數(shù)類型至少有一項(xiàng)是不相同的;第三個(gè)特點(diǎn)是方法的返回類型不一定要是相同的;第四個(gè)特點(diǎn)是方法的修飾符也可以是不相同的。
1.2 方法覆蓋的特點(diǎn)
Java語(yǔ)言中的方法覆蓋是指父類中有的方法,在子類中被重新定義,方法簽名一樣(方法名,參數(shù)個(gè)數(shù)和參數(shù)類型都一樣)的情況,也叫動(dòng)態(tài)多態(tài)。
如下面的例子:
public class Base {
public void method() {}
}
public class Sub extends Base{
public void method() {}
}
方法覆蓋的特點(diǎn)主要有以下幾點(diǎn):第一個(gè)特點(diǎn)是方法覆蓋只存在于子類和父類之間,在同一個(gè)類中的方法不能被覆蓋;第二個(gè)特點(diǎn)是父類方法拋出的異??梢员茸宇惙椒ǜ?; 第三個(gè)特點(diǎn)是父類方法的名稱、參數(shù)簽名和返回類型與子類方法的是一致的; 第四個(gè)特點(diǎn)是子類是不允許將父類的靜態(tài)方法覆蓋為非靜態(tài)方法,父類的非靜態(tài)方法也不能被子類覆蓋為靜態(tài)方法;第五個(gè)特點(diǎn)是子類方法不能縮小父類方法的訪問(wèn)權(quán)限;第六個(gè)特點(diǎn)是子類不能覆蓋父類的私有方法;第七個(gè)特點(diǎn)是子類可以通過(guò)兩種途徑覆蓋父類的抽象方法:一種是子類實(shí)現(xiàn)父類的抽象方法,另一種是子類重新聲明父類的抽象方法;第八個(gè)特點(diǎn)是父類的非抽象方法可以被覆蓋為抽象方法。
2 方法重載與方法覆蓋的異同
2.1 方法重載與方法覆蓋的相同點(diǎn)
Java語(yǔ)言中,方法重載與方法覆蓋的主要相同點(diǎn)有兩個(gè):第一個(gè)相同點(diǎn)是法重載與方法覆蓋都要求方法同名;第二個(gè)相同點(diǎn)是方法重載與方法覆蓋在抽象方法和非抽象方法之間都可以使用。
2.2 方法重載與方法覆蓋的不同點(diǎn)
Java語(yǔ)言中,方法重載與方法覆蓋的主要不同點(diǎn)有以下5個(gè):第一個(gè)不同點(diǎn)是方法重載不允許參數(shù)簽名一致,相反,方法覆蓋則要求參數(shù)簽名必須一致;第二個(gè)不同點(diǎn)是方法重載對(duì)返回類型是否一致不做限制,而方法覆蓋則要求返回類型必須一致;第三個(gè)不同點(diǎn)是方法重載可以用于同一個(gè)類的所有方法,而方法覆蓋則僅限于用于子類覆蓋父類的方法;第四個(gè)不同點(diǎn)是方法重載對(duì)方法的訪問(wèn)權(quán)限和拋出的異常方法不做限制性要求,而方法覆蓋對(duì)此則有特殊的要求;第五個(gè)不同點(diǎn)是一個(gè)方法在所在的類中可以多次重載,而父類的一個(gè)方法則只能被子類覆蓋一次。
總之,方法的重載(Overload)和覆蓋(Overrid)是Java多態(tài)性的不同表現(xiàn)。重載(Overload)是一個(gè)類中多態(tài)性的一種表現(xiàn),而覆蓋(Overrid)是父類與子類之間多態(tài)性的一種表現(xiàn)。靈活地運(yùn)用方法重載與方法覆蓋,不僅能減少編碼的工作量,也能大大提高程序的可維護(hù)性及可擴(kuò)展性。
參考文獻(xiàn)
[1]姜靜思.Java中類的多態(tài)性分析[J].科技展望,2015(01).
[2]陽(yáng)小蘭,錢程.JAVA語(yǔ)言中構(gòu)造方法的繼承與重載探討[J].電腦知識(shí)與技術(shù),2010(21).
[3]李寧.Java中的方法重寫與方法重載[J].科技信息,2009(03).