版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年黃山學(xué)院師資博士后招聘11名考試備考題庫及答案解析
- 2026吉林大學(xué)白求恩第一醫(yī)院康復(fù)科招聘考試參考試題及答案解析
- 2026年上半年江蘇南通職業(yè)大學(xué)招聘高層次人才18人考試參考試題及答案解析
- 2026博州賽里木湖文化旅游投資集團(tuán)有限公司招聘信息(1人)考試備考題庫及答案解析
- 2025下半年江西九江市國信項(xiàng)目管理咨詢有限責(zé)任公司人員招聘體檢考試參考試題及答案解析
- 2026年齊齊哈爾建華區(qū)消防大隊(duì)政府專職消防員招聘11人筆試備考題庫及答案解析
- 2026年河北建材職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試備考題庫帶答案解析
- 中兵勘察設(shè)計(jì)研究院有限公司2026校招考試參考試題及答案解析
- 2026年安徽水利水電職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試模擬試題帶答案解析
- 2026年春季學(xué)期廣東廣州市天河區(qū)同仁天興學(xué)校招聘4人筆試備考試題及答案解析
- 非遺傳承人激勵(lì)機(jī)制探索-深度研究
- 中小學(xué)校園中匹克球推廣策略與實(shí)踐研究
- 2024年世界職業(yè)院校技能大賽高職組“體育活動(dòng)設(shè)計(jì)與實(shí)施組”賽項(xiàng)考試題庫(含答案)
- 高中地理選擇性必修一(湘教版)期末檢測卷02(原卷版)
- 滬教版九年級(jí)化學(xué)上冊(cè)(上海版)全套講義
- 三角函數(shù)圖像變化課件
- 《內(nèi)存條知識(shí)培訓(xùn)》課件
- 人教版(2024)七年級(jí)地理期末復(fù)習(xí)必背考點(diǎn)提綱
- 廣東省深圳市南山區(qū)2023-2024學(xué)年四年級(jí)上學(xué)期數(shù)學(xué)期末教學(xué)質(zhì)量監(jiān)測試卷
- 【MOOC】生物化學(xué)與分子生物學(xué)-華中科技大學(xué) 中國大學(xué)慕課MOOC答案
- 幼兒園小班美術(shù)《雪花飄飄》課件
評(píng)論
0/150
提交評(píng)論