JAVA入门级教学之(多态)
JAVA入門級(jí)教學(xué)之(多態(tài))
?
怎么理解多態(tài):你本身就該喊你爹叫爹,你讓你爹叫你爹就是強(qiáng)制認(rèn)做爹
?
?
多態(tài)的使用:
A? a = new D();
D類繼承A類,父類型引用指向子類型對(duì)象
?* 關(guān)于java語(yǔ)言匯總的多態(tài)語(yǔ)法機(jī)制:【只是多態(tài)的基礎(chǔ)語(yǔ)法,多態(tài)的作用后續(xù)說(shuō)明】
?*?
?* ?? ?1.多態(tài)中設(shè)計(jì)的幾個(gè)概念
?*?
?* ?? ??? ?*向上轉(zhuǎn)型(upcasting)
?* ?? ??? ??? ?子類型轉(zhuǎn)父類型:自動(dòng)類型轉(zhuǎn)換
?* ?? ??? ?
?* ?? ??? ?*向下轉(zhuǎn)型(downcasting)
?* ?? ??? ??? ?父類型轉(zhuǎn)子類型:強(qiáng)制類型轉(zhuǎn)換【需要加強(qiáng)制類型轉(zhuǎn)換符】
?*?
?* ?? ?2.無(wú)論是向上轉(zhuǎn)型還是向下轉(zhuǎn)型,兩種類型之間必須存在繼承關(guān)系
?*?
?* ?? ? ?*沒(méi)有繼承關(guān)系,程序是無(wú)法編譯通過(guò)的
?
代碼演示:
?
---------------------------------------------------------------------------------------------------------------------------------------------------------------?
新建一個(gè)動(dòng)物類?
package com.lbj.javase11;public class Animal {public void move(){System.out.println("動(dòng)物都可以移動(dòng)");}}新建一個(gè)鳥(niǎo)類繼承動(dòng)物類?
package com.lbj.javase11;public class Bird extends Animal {public void move(){System.out.println("鳥(niǎo)會(huì)飛");}//子類特有的行為public void fly(){System.out.println("fly method");} }?新建一個(gè)貓類繼承動(dòng)物類
package com.lbj.javase11;public class Cat extends Animal{//重寫父類中繼承過(guò)來(lái)的方法public void move(){System.out.println("貓會(huì)走貓步");}//不是父類中繼承過(guò)來(lái)的方法//這個(gè)方法是子類對(duì)象特有的行為【不是說(shuō)所有的動(dòng)物都能抓老鼠】public void catchMouse(){System.out.println("貓抓老鼠");} }?新建一個(gè)測(cè)試類:
package com.lbj.javase11; /*** 你本身就該就你爹叫爹,你讓你爹叫你爹就是強(qiáng)制認(rèn)做爹* * 關(guān)于java語(yǔ)言匯總的多態(tài)語(yǔ)法機(jī)制:【只是多態(tài)的基礎(chǔ)語(yǔ)法,多態(tài)的作用后續(xù)說(shuō)明】* * 1.多態(tài)中設(shè)計(jì)的幾個(gè)概念* * *向上轉(zhuǎn)型(upcasting)* 子類型轉(zhuǎn)父類型:自動(dòng)類型轉(zhuǎn)換* * *向下轉(zhuǎn)型(downcasting)* 父類型轉(zhuǎn)子類型:強(qiáng)制類型轉(zhuǎn)換【需要加強(qiáng)制類型轉(zhuǎn)換符】* * 2.無(wú)論是向上轉(zhuǎn)型還是向下轉(zhuǎn)型,兩種類型之間必須存在繼承關(guān)系* * *沒(méi)有繼承關(guān)系,程序是無(wú)法編譯通過(guò)的* @author 14811****/ public class Test {public static void main(String[] args) {//使用多態(tài)語(yǔ)法機(jī)制/** 1.Animal和cat之間存在繼承關(guān)系,Animal是父類,Cat是子類* * 2.Cat is a Animal是合理的* * 3.new Cat() 創(chuàng)建的對(duì)象類型是Cat,a2這個(gè)引用的數(shù)據(jù)類型是Animal,可見(jiàn)* 它們進(jìn)行了類型轉(zhuǎn)換:子類型轉(zhuǎn)換成父類型,稱為向上轉(zhuǎn)型/upcasting,稱為自動(dòng)類型轉(zhuǎn)換* * 4.java中允許這種語(yǔ)法:父類型引用指向子類型對(duì)象 */Animal a2=new Cat();/** 1.java程序永遠(yuǎn)都分為編輯階段和運(yùn)行階段* * 2.先分析編譯階段,再分析運(yùn)行階段,如果編譯無(wú)法通過(guò),根本是無(wú)法運(yùn)行的* * 3.編譯階段編譯器檢查a2這個(gè)引用的數(shù)據(jù)類型為Animal,由于Animal.class* 的字節(jié)碼中有move()方法,所以編譯通過(guò)了。這個(gè)過(guò)程我們稱為靜態(tài)綁定【編譯階段綁定】* 只有靜態(tài)綁定成功后才有后續(xù)的運(yùn)行* * 4.在程序運(yùn)行階段,JVM堆內(nèi)存中真實(shí)創(chuàng)建的對(duì)象是Cat對(duì)象,那么以下程序在運(yùn)行階段* 一定會(huì)調(diào)用Cat對(duì)象的move()方法,此時(shí)發(fā)生了程序的動(dòng)態(tài)綁定【運(yùn)行階段綁定】* * 5.無(wú)論是Cat類中有沒(méi)有重寫move方法,運(yùn)行階段一定調(diào)用的是Cat對(duì)象的move方法,因?yàn)? 底層真實(shí)的對(duì)象就是Cat對(duì)象* * 6.父類型引用指向子類型對(duì)象這種機(jī)制導(dǎo)致程序存在編譯階段和運(yùn)行階段綁定兩種不同的形態(tài)* 這種機(jī)制就叫做多態(tài)語(yǔ)法機(jī)制*/a2.move();/** 分析以下程序?yàn)槭裁床荒苷{(diào)用:* 因?yàn)榫幾g階段編譯器檢查到a2的類型是Animal類型* 從Animal.class字節(jié)碼文件中查找catchMouse()方法,最終沒(méi)有找到該方法* 導(dǎo)致靜態(tài)綁定失敗,沒(méi)有綁定成功,也就是說(shuō)編譯失敗了,更別說(shuō)運(yùn)行了*///a2.catchMouse();/** 假設(shè)想讓以上的對(duì)象執(zhí)行catchMouse()方法 ,怎么辦?* a2是無(wú)法直接調(diào)用的,因?yàn)閍2的類型Animal,Animal中沒(méi)有catchMouse()方法* 我們可以將a2強(qiáng)制類型轉(zhuǎn)換成Cat類型* a2的類型是Animal(父類),轉(zhuǎn)換成Cat類型(子類),被稱為向下轉(zhuǎn)型/downCasting/強(qiáng)制類型轉(zhuǎn)換* * 注:向下轉(zhuǎn)型也需要兩種類型之間必須有繼承關(guān)系,不然編譯報(bào)錯(cuò)。強(qiáng)制類型轉(zhuǎn)換需要加強(qiáng)制類型轉(zhuǎn)換符** 什么時(shí)候需要使用向下轉(zhuǎn)型呢?* 當(dāng)調(diào)用的方法是子類型中特有的,在父類型中不存在,必須進(jìn)行向下轉(zhuǎn)型*/Cat c2=(Cat)a2;c2.catchMouse();//----------------------------------Animal a3=new Bird();/** 1.以下程序編譯是沒(méi)有問(wèn)題的,因?yàn)榫幾g器檢查到a3的數(shù)據(jù)類型是Animal* Animal和Cat之間存在繼承關(guān)系,并且Animal是父類型,Cat是子類型* 父類型轉(zhuǎn)換成子類型叫做向下轉(zhuǎn)型,語(yǔ)法合格* * 2.雖然程序通過(guò)了,但是程序在運(yùn)行階段會(huì)出現(xiàn)異常,因?yàn)镴VM堆內(nèi)存中* 真實(shí)存在的對(duì)象是Bird類型,Bird對(duì)象無(wú)法轉(zhuǎn)換成Cat對(duì)象,因?yàn)閮煞N* 類型之間不存在任何繼承關(guān)系,此時(shí)出現(xiàn)了著名的異常* java.lang.ClassCastException:* 類型轉(zhuǎn)換異常,這種異常總是在"向下轉(zhuǎn)型"的時(shí)候會(huì)發(fā)生*///Cat c3=(Cat)a3;//--------------------------------------------/** 1.以上異常只有在強(qiáng)制類型轉(zhuǎn)換的時(shí)候會(huì)發(fā)生,也就是說(shuō)"向下轉(zhuǎn)型"存在隱患(編譯通過(guò)了,但是運(yùn)行出錯(cuò)了)* * 2.向上轉(zhuǎn)型只要編譯通過(guò),運(yùn)行一定不會(huì)出問(wèn)題* * 3.向下轉(zhuǎn)型編譯通過(guò),運(yùn)行可能錯(cuò)誤* * 4.怎么避免向下轉(zhuǎn)型出現(xiàn) java.lang.ClassCastException:呢?* -使用instanceof運(yùn)算符可以避免出現(xiàn)以上的異常* * 5.instanceof運(yùn)算符怎么用?* -5.1語(yǔ)法格式:* (引用名 instanceof 數(shù)據(jù)類型名)* * -5.2以上運(yùn)算符的執(zhí)行結(jié)果類型是布爾類型,結(jié)果可能是true/false* * -5.3關(guān)于運(yùn)算結(jié)果true/false* 假設(shè):(a instanceof Animal)* true表示:* a這個(gè)引用指向的對(duì)象是一個(gè)Animal類型* false表示:* a這個(gè)引用指向的對(duì)象不是一個(gè)Animal類型* * 6.java規(guī)范中要求:在進(jìn)行強(qiáng)制類型轉(zhuǎn)換之前,建議采用 instancsof運(yùn)算符進(jìn)行判斷,避免異常的發(fā)生*///當(dāng)a3引用指向的對(duì)象卻是是一個(gè)Cat的時(shí)候【等同于:a3 是Cat的實(shí)例嗎? 】{ // Cat c3=(Cat)a3;//}if(a3 instanceof Cat){Cat c3=(Cat)a3;//這時(shí)候編譯器就會(huì)檢測(cè)}else if(a3 instanceof Bird){//a3確實(shí)是Bird類的,所以再?gòu)?qiáng)制轉(zhuǎn)換就會(huì)成功Bird b2=(Bird)a3;b2.fly();}}}?
總結(jié)
以上是生活随笔為你收集整理的JAVA入门级教学之(多态)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python的模块提供了许多文件处理方法
- 下一篇: JAVA入门级教学之(文档里的is-a、