中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

方法重寫與方法重載

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

繼承和多態(tài)都是面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)。使用繼承可以在一個(gè)父類的基礎(chǔ)上再創(chuàng)建一個(gè)子類,這個(gè)子類不但擁有父類已有的屬性和方法,還可以創(chuàng)建屬于自己的屬性和方法。由于子類和父類之間的關(guān)系,從而引出了方法重寫和方法重載的問題。方法重寫及方法重載在繼承和多態(tài)性方面的應(yīng)用中會(huì)存在很多問題,這些概念很容易混淆,掌握重寫和重載的區(qū)別對(duì)學(xué)會(huì)使用多態(tài)的方式編寫程序、提高程序的可維護(hù)性奠定了基礎(chǔ)。

一、方法重寫(0veriding)
如何定義重寫:在Java程序中,類的繼承關(guān)系可以產(chǎn)生一個(gè)子類,子類繼承父類,它具備了父類所有的特征,繼承了父類所有的方法和變量。子類可以定義新的特征,當(dāng)子類需要修改父類的一些方法進(jìn)行擴(kuò)展,增大功能,程序設(shè)計(jì)者常常把這樣的一種操作方法稱為重寫,也叫稱為覆寫或覆蓋。重寫體現(xiàn)了Java優(yōu)越
性,重寫是建立在繼承關(guān)系上,它使語(yǔ)言結(jié)構(gòu)更加豐富。在Java中的繼承中,子類既可以隱藏和訪問父類的方法,也可以覆蓋繼承父類的方法。在Java中覆蓋繼承父類的方法就是通過方法的重寫來實(shí)現(xiàn)的。

所謂方法的重寫是指子類中的方法與父類中繼承的方法有完全相同的返回值類型、方法名、參數(shù)個(gè)數(shù)以及參數(shù)類型。這樣,就可以實(shí)現(xiàn)對(duì)父類方法的覆蓋。例如:下面的代碼實(shí)現(xiàn)了方法的重寫。


class Person//定義父類
fpublic void print(){//父類中的方法
System.out.println( 父類Person的print方法! );
}
}
class Student extends Person//定義子類繼承Person類
{public void print(){//方法的重寫
System.out.println( 子類Student的print方法! );
}
}
public class 0verrideExampleO1
{public static void main(String args[])
{Student s=new Student();
S.print();
}
}

運(yùn)行結(jié)果:子類Student的print方法!

可以看出,當(dāng)子類重寫了父類中的print()方法后,使用S調(diào)用的是子類的print()方法,父類中的print()方法被覆蓋了。也就是說,如果現(xiàn)在子類將父類中的方法重寫了,調(diào)用的時(shí)候肯定是調(diào)用被重寫過的方法,那么如果現(xiàn)在一定要調(diào)用父類中的方法該怎么辦呢?此時(shí),通過使用.. super關(guān)鍵就可以實(shí)現(xiàn)這個(gè)功能,super關(guān)鍵字可以從子類訪問父類中的內(nèi)容,如果要訪問被重寫過的方法,使用“super.方法名(參數(shù)列表)”的形式調(diào)用。

例如:
Class Person
{public void print () {
System.out.println( 父類Person的print方法! );
}
}
class Student extends Person
{public void print () {
super.print(://訪問父類中被子類覆寫過的方法
System.out.println(" 子類Student的print方法!" );
}
}
public class OverrideExample02
{public static void main(String args[])
{Student s=new Student();
S.print();
}
}
運(yùn)行結(jié)果:父類Person的print方法!
子類Student的print方法 !
如果要使用super關(guān)鍵字不一定非要在方法重寫之后使用,

也可以明確地表示某個(gè)方法是從父類中繼承而來的。使用super

只是更加明確的說,要從父類中查找,就不在子類查找了。

二、重寫規(guī)則
在重寫方法時(shí),需要遵循以下的規(guī)則: 

(一)  父類方法的參數(shù)列表必須完全與被子類重寫的方法的參數(shù)列表相同,否則不能稱其為重寫而是重載。.. 
(二)  父類的返回類型必須與被子類重寫的方法返回類型相同,否則不能稱其為重寫而是重載。.. 
(三)  Java中規(guī)定,被子類重寫的方法不能擁有比父類方法更加嚴(yán)格的訪問權(quán)限。訪問權(quán)限大小關(guān)系為:

編寫過Java程序的人就知道,父類中的方法并不是在任何情況下都可以重寫的,當(dāng)父類中方法的訪問權(quán)限修飾符為private時(shí),該方法只能被自己的類訪問,不能被外部的類訪問,在子類是不能被重寫的。如果定義父類的方法為public,在子類定義為private,程序運(yùn)行時(shí)就會(huì)報(bào)錯(cuò)。例如: 

class Person
{public void print()(//public訪問權(quán)限
System.out.println( "父類Person的print方法! ");
}
}
Class Stedent extends Person
{private void print()(//重寫方法降低了訪問權(quán)限,錯(cuò)誤
System.out.println( "子類Student的print方法!" );
}
}
(四)  由于父類的訪問權(quán)限修飾符的限制一定要大于被子類重寫方法的訪問權(quán)限修飾符,而private權(quán)限最小。所以如果某一個(gè)方法在父類中的訪問權(quán)限是private,那么就不能在子類中對(duì)其進(jìn)行重寫。如果重新定義,也只是定義了一個(gè)新的方法,不會(huì)達(dá)到重寫的效果。 

(五)  在繼承過程中如果父類當(dāng)中的方法拋出異常,那么在子類中重寫父類的該方法時(shí),也要拋出異常,而且拋出的異常不能多于父類中拋出的異常(可以等于父類中拋出的異常)。換句話說,重寫方法一定不能拋出新的檢查異常,或者比被重寫方法聲明更加寬泛的檢查型異常。例如,父類的一個(gè)方法申明了一個(gè)檢查異常IOException,在重寫這個(gè)方法時(shí)就不能拋出Exception,只能拋出IOException的子類異常,可以拋出非檢查異常。


同樣的道理,如果子類中創(chuàng)建了一個(gè)成員變量,而該變量和
父類中的一個(gè)變量名稱相同,稱作變量重寫或?qū)傩愿采w。但是此
概念一般很少有人去研究它,因?yàn)橐饬x不大。

三、方法重載(Overloading)

(一)  如何定義重載。方法的重寫和重載只有一個(gè)字不同,很多初學(xué)者認(rèn)為這兩者十分相似,其實(shí)不然。方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。調(diào)用方法時(shí)通過傳遞給它們的不同個(gè)數(shù)和類型的參數(shù)來決定具體使用哪個(gè)方法,這就是多態(tài)性。
所謂方法重載是指在一個(gè)類中,多個(gè)方法的方法名相同,但是參數(shù)列表不同。參數(shù)列表不同指的是參數(shù)個(gè)數(shù)、參數(shù)類型或者參數(shù)的順序不同。方法的重載在實(shí)際應(yīng)用中也會(huì)經(jīng)常用到。不僅是一般的方法,構(gòu)造方法也可以重載。下面通過一個(gè)實(shí)例來分析。
重載的定義和使用方法。 

Class Person {
{String name; 
int age;
void print(){ 
System.out.println("姓名:" +name+"年齡:" +age); 
}
void print(String a,int b){ 
System.out.println("姓名:" +a+"年齡:"+b); 
void print(String a,int b,intC){ 
System.out.println("姓名:"+a+"年齡:" +b+"ID號(hào):" +c); 
}
void print(String a,int b,doubleC){ 
System.out.println("姓名:"+a+"年齡:" +b+"ID號(hào):"+c); 

}

public class OverLoadExampleOL 
{publicstaticvoidmain(String args[]) 
{Personpl=newPerson();
p1.nanle="李明";
p1.age=22;
p1.print(); 
p1.print("王小早",19); 
p1.print("金波",18,100325); 
p1.print("婉寧",25,110903); 

}

在上面的程序中,可以看到Person類中有多個(gè)名為 void print的方法,這就是方法的重載。執(zhí)行程序,運(yùn)行結(jié)果如下:

姓名:李明年齡:22
姓名:王小早年齡:l9
姓名:金波年齡:18ID號(hào):10 00325
姓名:婉寧年齡:25ID號(hào):110903

在方法重載時(shí),方法之間需要存在一定的聯(lián)系,因?yàn)檫@樣可以提高程序的可讀性,一般只重載功能相似的方法重載規(guī)則。重載是指我們可以定義一些名稱相同的方法,通過定義不同的參數(shù)來區(qū)分這些方法,然后再調(diào)用時(shí),Java虛擬機(jī)就會(huì)根
據(jù)不同的參數(shù)列表來選擇合適的方法執(zhí)行。也就是說,當(dāng)一個(gè)重載方法被調(diào)用時(shí),Java用參數(shù)的類型和.. (或)個(gè)數(shù)來決定實(shí)際調(diào)用的重載方法。因此,每個(gè)重載方法的參數(shù)的類型或個(gè)數(shù)必須是不同。雖然每個(gè)重載方法可以有不同的返回類型,
但返回類型并不足以區(qū)分所使用的是哪個(gè)方法。當(dāng)Java調(diào)用一個(gè)重載方法是,參數(shù)與調(diào)用參數(shù)匹配的方法被執(zhí)行。在使用重載要注意以下的幾點(diǎn):

1.在使用重載時(shí)只能通過不同的參數(shù)列表,必須具有不同的參數(shù)列表。例如,不同的參數(shù)類型,不同的參數(shù)個(gè)數(shù),不同的參數(shù)順序。當(dāng)然,同一方法內(nèi)的幾個(gè)參數(shù)類型必須不一樣,例如可以是 fun(int,float),但是不能為 fun(int,int)。
2.不能通過訪問權(quán)限、返回類型、拋出的異常進(jìn)行重載。
3.方法的異常類型和數(shù)目不會(huì)對(duì)重載造成影響。.. 
4.可以有不同的返回類型,只要參數(shù)列表不同就可以了。
5.可以有不同的訪問修飾符。

6.可以拋出不同的異常。

四、方法重寫與方法重載的區(qū)別
通過上面例子的分析,我們可以將方法重寫和重載的區(qū)別總
結(jié)成這樣一個(gè)表格,如下:

區(qū)別點(diǎn)

重載

重寫(覆寫)

英文

Overloading

Overiding

定義

方法名稱相同,參數(shù)的類型或個(gè)數(shù)不同

方法名稱、參數(shù)類型、返回值類型全部相同

對(duì)權(quán)限沒有要求

被重寫的方法不能擁有更嚴(yán)格的權(quán)限

范圍

發(fā)生在一個(gè)類中

發(fā)生在繼承類中

 

五、結(jié)束語(yǔ)
在面向?qū)ο蟪绦蛟O(shè)計(jì)的思想中,類的繼承和多態(tài)性主要就是體現(xiàn)在子類重寫父類的方法。而構(gòu)造方法的重載作為方法重載的一個(gè)典型特例,可以通過重載構(gòu)造方法來表達(dá)對(duì)象的多種初始化行為。靈活的運(yùn)用方法重寫與方法重載,不僅能減少編碼的工作量,也能大大提高程序的可維護(hù)性及可擴(kuò)展性。用好重寫和重載
可以設(shè)計(jì)一個(gè)結(jié)構(gòu)清晰而簡(jiǎn)潔的類,可以說重寫和重載在編寫代碼過程中的作用非同一般。

標(biāo)簽: 代碼 權(quán)限

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Java最大的優(yōu)勢(shì)真的在于跨平臺(tái)嗎?

下一篇:C語(yǔ)言雜談:指針與數(shù)組(下)