深入解析Java多態(tài)進(jìn)階學(xué)習(xí)_第1頁
深入解析Java多態(tài)進(jìn)階學(xué)習(xí)_第2頁
深入解析Java多態(tài)進(jìn)階學(xué)習(xí)_第3頁
深入解析Java多態(tài)進(jìn)階學(xué)習(xí)_第4頁
深入解析Java多態(tài)進(jìn)階學(xué)習(xí)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第深入解析Java多態(tài)進(jìn)階學(xué)習(xí)目錄1.動(dòng)態(tài)綁定機(jī)制實(shí)例A實(shí)例B實(shí)例C2.多態(tài)數(shù)組3.多態(tài)數(shù)組的高階用法4.多態(tài)參數(shù)5.多態(tài)參數(shù)的高階用法

1.動(dòng)態(tài)綁定機(jī)制

java的動(dòng)態(tài)綁定機(jī)制非常重要

實(shí)例A

我們來看一個(gè)實(shí)例:

閱讀上面的代碼,請(qǐng)說明下面的程序?qū)⑤敵鍪裁唇Y(jié)果:

程序?qū)?huì)輸出40和30,這個(gè)實(shí)例很簡單,直接看運(yùn)行類型即可,該代碼的運(yùn)行類型為B,所以會(huì)調(diào)用B類的方法

實(shí)例B

我們將上面的代碼變通一下,將子類中的如下代碼塊注銷:

隨后繼承機(jī)制會(huì)訪問父類的sum方法:

那么這里有一個(gè)問題,此處的getI(),會(huì)執(zhí)行子類的還是父類的呢?

當(dāng)調(diào)用對(duì)象方法的時(shí)候,該方法會(huì)和該對(duì)象的內(nèi)存地址/運(yùn)行類型綁定

代碼的運(yùn)行類型依然是B,所以此處會(huì)執(zhí)行子類的getI()方法,結(jié)果輸出為30

實(shí)例C

現(xiàn)在我們?cè)僮兺ㄒ韵律厦娴拇a

再將子類中如下的代碼塊注銷:

繼承機(jī)制會(huì)執(zhí)行父類的sum1方法:

那么這里有一個(gè)問題,此處的i,會(huì)使用子類的還是父類的呢?

屬性沒有動(dòng)態(tài)綁定機(jī)制,哪里聲明,哪里使用(使用當(dāng)前類的)

此處的i在父類進(jìn)行聲明,所以會(huì)選用父類的i屬性,結(jié)果為20

2.多態(tài)數(shù)組

定義:

數(shù)組的定義類型為父類類型,但是保存的實(shí)際元素類型為子類類型

Person父類:

/**

*多態(tài)數(shù)組父類

publicclassPerson{

privateStringname;

privateintage;

publicPerson(Stringname,intage){

=name;

this.age=age;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

=name;

publicintgetAge(){

returnage;

publicvoidsetAge(intage){

this.age=age;

publicStringsay(){

returnname+'\t'+age;

Student子類:

/**

*多態(tài)數(shù)組學(xué)生子類

publicclassStudentextendsPerson{

privatedoublescore;

publicStudent(Stringname,intage,doublescore){

super(name,age);

this.score=score;

//重寫父類的say方法

publicStringsay(){

returnsuper.say()+'\t'+score;

Teacher子類:

/**

*多態(tài)數(shù)組教師子類

publicclassTeacherextendsPerson{

privatedoublesal;

publicTeacher(Stringname,intage,doublesal){

super(name,age);

this.sal=sal;

publicdoublegetSal(){

returnsal;

publicvoidsetSal(doublesal){

this.sal=sal;

publicStringsay(){

returnsuper.say()+'\t'+sal;

測試多態(tài)數(shù)組的使用:

publicclassTest{

publicstaticvoidmain(String[]args){

//多態(tài)數(shù)組的使用

Person[]persons=newPerson[5];

persons[0]=newPerson("dahe",20);

persons[1]=newStudent("wangwei",11,100);

persons[2]=newStudent("zhangsan",12,60);

persons[3]=newTeacher("wang",33,15000);

persons[4]=newTeacher("li",55,25000);

//循環(huán)遍歷多態(tài)數(shù)組,調(diào)用say方法

for(inti=0;ipersons.length;i++){

Stringout=persons[i].say();//動(dòng)態(tài)綁定機(jī)制,編譯類型永遠(yuǎn)都是Person

//運(yùn)行類型是根據(jù)實(shí)際情況由JVM機(jī)決定

System.out.println(out);

輸出:

dahe20

wangwei11100.0

zhangsan1260.0

wang3315000.0

li5525000.0

3.多態(tài)數(shù)組的高階用法

現(xiàn)在,教師子類新增了教學(xué)方法:

publicvoidteach(){

System.out.println("老師:"+getName()+"正在講課!");

學(xué)生子類新增了學(xué)習(xí)方法:

publicvoidstudy(){

System.out.println("學(xué)生:"+getName()+"正在學(xué)習(xí)!");

那么,有沒有辦法通過多態(tài)數(shù)組來訪問他們子類對(duì)應(yīng)的獨(dú)有的方法呢?事實(shí)上,可以通過巧妙使用instanceof來解決:

變通一下,改變多態(tài)數(shù)組的循環(huán)操作:

//循環(huán)遍歷多態(tài)數(shù)組,調(diào)用say方法

for(inti=0;ipersons.length;i++){

Stringout=persons[i].say();//動(dòng)態(tài)綁定機(jī)制,編譯類型永遠(yuǎn)都是Person

//運(yùn)行類型是根據(jù)實(shí)際情況由JVM機(jī)決定

System.out.println(out);

if(persons[i]instanceofStudent){

//向下轉(zhuǎn)型

Studentstudent=(Student)persons[i];

student.study();

}elseif(persons[i]instanceofTeacher){

Teacherteacher=(Teacher)persons[i];

teacher.teach();

輸出:

dahe20

wangwei11100.0

學(xué)生:wangwei正在學(xué)習(xí)!

zhangsan1260.0

學(xué)生:zhangsan正在學(xué)習(xí)!

wang3315000.0

老師:wang正在講課!

li5525000.0

老師:li正在講課!

大功告成!多態(tài)數(shù)組即強(qiáng)大又完美!

4.多態(tài)參數(shù)

方法定義的形參類型為父類類型,實(shí)參類型允許為子類類型

接下來我們來演示以下多態(tài)參數(shù)的使用:

父類:

/**

*多態(tài)參數(shù)-父類

publicclassEmployee{

privateStringname;

privatedoublesal;

publicEmployee(Stringname,doublesal){

=name;

this.sal=sal;

publicStringgetName(){

returnname;

publicvoidsetName(Stringname){

=name;

publicdoublegetSal(){

returnsal;

publicvoidsetSal(doublesal){

this.sal=sal;

//得到年工資的方法

publicdoublegetAnnual(){

return12*sal;

員工子類:

/**

*多態(tài)參數(shù)-子類員工

publicclassWorkerextendsEmployee{

publicWorker(Stringname,doublesal){

super(name,sal);

publicvoidwork(){

System.out.println("普通員工:"+getName()+"正在工作!");

publicdoublegetAnnual(){

returnsuper.getAnnual();

經(jīng)理子類:

/**

*多態(tài)參數(shù)-經(jīng)理子類

publicclassManagerextendsEmployee{

privatedoublebonus;//獎(jiǎng)金

publicManager(Stringname,doublesal,doublebonus){

super(name,sal);

this.bonus=bonus;

publicdoublegetBonus(){

returnbonus;

publicvoidsetBonus(doublebonus){

this.bonus=bonus;

publicvoidmanage(){

System.out.println("經(jīng)理:"+getName()+"正在管理!");

@Override

publicdoublegetAnnual(){

returnsuper.getAnnual()+bonus;

我們來測試一下,求不同崗位的雇員的年薪:

/**

*多態(tài)參數(shù)測試類

public

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論