摘要:多態(tài)的基本認(rèn)識概述多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。多態(tài)的好處可以使程序有良好的擴(kuò)展,并可以對所有類的對象進(jìn)行通用處理。
3.1多態(tài)的基本認(rèn)識 概述:多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。
如下圖:黑白打印機(jī)和彩色打印機(jī)相同的打印行為卻有著不同的打印效果
前提:·有繼承關(guān)系
·有方法重寫(抽象方法)
·有父類引用指向子類對象
格式:parent p = new Chile();
把子的對象賦值給父
當(dāng)使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,再去調(diào)用子類的同名方法。
多態(tài)的好處:可以使程序有良好的擴(kuò)展,并可以對所有類的對象進(jìn)行通用處理。
3.2 多態(tài)中的成員訪問方法Fu f = new zi;
我們按照上面給出格式來寫一段代碼(Zi繼承Fu類)
A:成員變量
編譯看左邊,運(yùn)行看左邊
B:構(gòu)造方法
創(chuàng)建子類對象的時候,訪問父類的構(gòu)造方法,對父類的數(shù)據(jù)進(jìn)行初化
C;成員方法
編譯看左邊,運(yùn)行看右邊
D;靜態(tài)方法
編譯看左邊,運(yùn)行看右邊
看左邊即在左邊即父類中尋找,看右邊即在子類中尋找
3.3 多態(tài)的好處和弊端 多態(tài)的好處:A:提高了代碼的維護(hù)性(繼承保護(hù))
B:提高了代碼的擴(kuò)展性(由多態(tài)保證)
Eg:例如一個程序中 狗 貓 豬 都繼承于動物類(Eg:AnimalTool)
分別寫出對應(yīng)的行為方法(Eg:eat() )
而將調(diào)用動物功能的代碼 寫入動物操作工具類
但是添加新的動物時,每次都需要修改工具類
為了優(yōu)化代碼,將工具類中 每一個動物的操作代碼名字
寫為動物總稱,添加新動物后,只需要在Demo中創(chuàng)建 新動物的對象 然后直接調(diào)用這個總的動物操作工具類
class Animal { public void eat() { System.out.println("eat"); } } class Dog extends Animal { public void eat() { System.out.println("狗吃肉"); } } class Cat extends Animal { public void eat() { System.out.println("貓吃肉"); } } class AnimalTool { private AnimalTool() {} //調(diào)用貓的功能 public static void useCat(Cat c) { c.eat(); } //調(diào)用狗的功能 public static void useDog(Dog d) { d.eat(); } //把所有的可能都?xì)w為動物類 public static void useAnimal(Animal a) { a.eat(); //還可以寫其他方法 } }
public class DuoTaiDemo { public static void main(String[] args) { /* * 直接創(chuàng)對象調(diào)用對應(yīng)方法 */ //我養(yǎng)了一只狗 Dog d = new Dog(); d.eat(); //我又養(yǎng)了一只狗 Dog d2 = new Dog(); d2.eat(); /* * 創(chuàng)對象、使用動物操作類調(diào)用對應(yīng)方法() */ Dog d3 = new Dog(); Dog d4 = new Dog(); AnimalTool.useDog(d3); AnimalTool.useDog(d4); //我喜歡貓 //定義一個豬類,它要繼承自動物,提一個eat()方法 //并且還得再工具類中添加該類方法的調(diào)用(即類似前面useDog())這樣無疑很麻煩 Cat c = new Cat(); Cat c2= new Cat(); AnimalTool.useCat(c); AnimalTool.useCat(c2); //推薦使用多態(tài) AnimalTool.useAnimal(c); AnimalTool.useAnimal(c2); }多態(tài)的弊端:
A:不能使用子類的特有功能
如果想使用:
·創(chuàng)建子類對象調(diào)用方法即可(可以但是很多時候不合理,而且太占內(nèi)存)
·把父類的引用強(qiáng)制轉(zhuǎn)換為子類的引用(向下轉(zhuǎn)型)
對象間的轉(zhuǎn)型問題:向上轉(zhuǎn)型:
Fu f = new Zi();
向下轉(zhuǎn)型:
Zi z = (Zi)f; //要求f必須能夠轉(zhuǎn)為Zi
class Fu { public void show() { System.out.println("show Fu"); } } class Zi { public void show() { System.out.println("show Zi"); } public void method() { System.out.println("method Zi"); } } class DuoTaiDemo2 { public static void main(String[] args) { Fu fu = new Zi(); fu.show(); //fu.method(); 錯誤,不能使用子類特有功能 //通過轉(zhuǎn)型可以使用子類特有功能 //創(chuàng)建子類對象 //可以但是不推薦 Zi zi = new Zi(); zi.show(); zi.method(); //要求f必須能夠轉(zhuǎn)為Zi //推薦() Zi zi2 = (Zi)fu; } }結(jié)尾:
如果內(nèi)容中有什么不足,或者錯誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^
如果能幫到你的話,那就來關(guān)注我吧!
在這里的我們素不相識,卻都在為了自己的夢而努力 ?一個堅持推送原創(chuàng)Java技術(shù)的公眾號:理想二旬不止
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/74726.html
摘要:而面向搜索引擎,就是我們要及時的使用百度谷歌遇到問題無法解決,先別急著放棄,可以去網(wǎng)絡(luò)尋找答案,你的坑大部分別人都已經(jīng)走過了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語言,到底哪一門才是適合我的?●我們?yōu)槭裁匆獙W(xué)習(xí)Java語言呢...
摘要:作為技術(shù)書籍或者視頻,講解一門語言的時候都是從最底層開始講解,底層的基礎(chǔ)有哪些呢首先是整個,讓我們對這門語言先混個臉熟,知道程序的基本結(jié)構(gòu),順帶著還會說一下注釋是什么樣子。 2018年新年剛過,就迷茫了,Java學(xué)不下去了,不知道從哪里學(xué)了。 那么多細(xì)節(jié)的東西,我根本記不住,看完就忘。 剛開始學(xué)習(xí)的時候熱情萬丈,持續(xù)不了幾天就慢慢退去。 作為技術(shù)書籍或者視頻,講解一門語言的時候都是...
摘要:我的入門到放棄之路最近看到很多相關(guān)的問題跟討論,越來越多的小伙伴喜歡這個框架了,同時也在看到了有些入門的小伙伴遇到了各種各樣的問題,本人也是框架使用都一枚,公司是騰訊阿里平安三巨頭合資的一家公司,分別上海深圳杭州北京廣州等多個分部,前端人員 showImg(https://segmentfault.com/img/bVbhonB?w=1278&h=722); 我的react入門到放棄之...
摘要:嚴(yán)格地說,應(yīng)該是模仿實驗。為什么覺得無從下手,看資料沒有頭緒經(jīng)驗總結(jié)看資料需要計劃耐心和速度這里所謂的資料包括書籍文檔。建議有報銷條件的同學(xué)自己設(shè)計一塊板子學(xué)習(xí)。無法報銷的同學(xué),可以選購一款開發(fā)板學(xué)習(xí)。 STM32系列基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計的ARMCortex...
閱讀 3109·2021-11-02 14:40
閱讀 889·2019-08-30 15:53
閱讀 1346·2019-08-30 15:53
閱讀 3317·2019-08-30 13:53
閱讀 3377·2019-08-29 12:50
閱讀 1196·2019-08-26 13:49
閱讀 1930·2019-08-26 12:20
閱讀 3727·2019-08-26 11:33