多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态
@Python大星
一、Python 類的封裝、繼承和多態(tài)
封裝
繼承
Python 支持多父類的繼承機(jī)制,所以需要注意圓括號(hào)中基類的順序,若是基類中有相同的方法名,并且在子類使用時(shí)未指定,Python 會(huì)從左至右搜索基類中是否包含該方法。一旦查找到則直接調(diào)用,后面不再繼續(xù)查找。解決了多重繼承的沖突問(wèn)題。
多態(tài)
狗、貓、豬都繼承了動(dòng)物類,并各自重寫(xiě)了 kind 方法。show_kind () 函數(shù)接收一個(gè) animal 參數(shù),并調(diào)用它的 kind 方法??梢钥闯?#xff0c;無(wú)論我們給 animal 傳遞的是狗、貓還是豬,都能正確的調(diào)用相應(yīng)的方法,打印對(duì)應(yīng)的信息。這就是多態(tài)。
二、Java 類的封裝、繼承和多態(tài)
封裝
隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問(wèn)方式,將變化隔離,便于使用,提高復(fù)用性和安全性。
1、封裝的優(yōu)點(diǎn)
① 良好的封裝能夠減少耦合。
② 類內(nèi)部的結(jié)構(gòu)可以自由修改。
③ 可以對(duì)成員變量進(jìn)行更精確的控制。
④ 隱藏信息,實(shí)現(xiàn)細(xì)節(jié)。
2、如何理解 Java 的封裝?
將類的某些信息隱藏在類內(nèi)部,不允許外部程序直接訪問(wèn),而是通過(guò)該類提供的方法來(lái)實(shí)現(xiàn)對(duì)隱藏信息的操作和訪問(wèn),常見(jiàn)的實(shí)現(xiàn)方式就是:getter、setter。
假設(shè)我們的類 Person 是這樣:
如果在外部代碼使用它,則需要:
但是,現(xiàn)實(shí)中如果很多外部代碼都使用了 Person 這個(gè)類;某一天,如果這個(gè)類的 age 需要換成 String 類型,那么,外部使用它的任何地方都需要需改 xxx.age="xxx"。
如果我們使用 getter、setter
這樣外部其他地方就不需要改了。
我們?cè)?getter、setter 中還可以對(duì)成員變量進(jìn)行精準(zhǔn)的控制
繼承
繼承就是子類繼承父類的特征和行為,使得子類對(duì)象(實(shí)例)具有父類的實(shí)例域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。如下圖
如果不用繼承,代碼可能這樣
Mouse 類
Cat 類
我們可以發(fā)現(xiàn)里面有很多重復(fù)性的代碼。
如果我們使用繼承
公共類 Animal
Cat類
Mouse 類
1、繼承的注意事項(xiàng)
① 子類只能繼承父類非私有的成員(成員方法和成員變量)
② 子類不能繼承父類的構(gòu)造方法,但是可以通過(guò) super 關(guān)鍵字去訪問(wèn)父類構(gòu)造方法
this 和 super 的區(qū)別?
this 代表本類對(duì)象的引用,super 代表父類存儲(chǔ)空間標(biāo)識(shí)。
【你一定遇到過(guò)Java 面試?yán)^承相關(guān)題目】
第一關(guān):
Parent 類
Son 類
輸出結(jié)果:
第二關(guān):
Parent 類
Son 類
輸出結(jié)果:
Java 是單繼承的,那為什么不能允許多繼承?
假設(shè)有一個(gè)老虎類,既繼承父類貓科,又繼承父類動(dòng)物科,如果兩個(gè)父類都有一個(gè)“吃”的方法,那么當(dāng)我們調(diào)用 “叫” 這個(gè)方法時(shí),它就不知道是貓科叫還是動(dòng)物叫了,這就是多重繼承的沖突。
多態(tài)
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作。
1、多態(tài)的優(yōu)點(diǎn)
① 消除類型之間的耦合關(guān)系
② 可替換性
③ 可擴(kuò)充性
④ 接口性
⑤ 靈活性
⑥ 簡(jiǎn)化性
2、多態(tài)存在的三個(gè)必要條件
繼承重寫(xiě)【初級(jí)面試必問(wèn):重寫(xiě)和重載的區(qū)別?】
① 重寫(xiě)
重寫(xiě)是子類對(duì)父類的允許訪問(wèn)的方法的實(shí)現(xiàn)過(guò)程進(jìn)行重新編寫(xiě),返回值和形參都不能改變。即外殼不變,核心重寫(xiě)!
重寫(xiě)的好處在于子類可以根據(jù)需要,定義特定于自己的行為。 也就是說(shuō)子類能夠根據(jù)需要實(shí)現(xiàn)父類的方法。
重寫(xiě)方法不能拋出新的檢查異常或者比被重寫(xiě)方法申明更加寬泛的異常。
② 重載
是指一個(gè)類中方法名稱相同,但參數(shù)的個(gè)數(shù),類型或順序不同與返回值無(wú)關(guān)!
注意:比如說(shuō)你方法名fun相同,參數(shù)個(gè)數(shù),類型順序相同,但是返回值一個(gè)是 void,一個(gè)是 String,這不構(gòu)成重載。試想一下,如果我們調(diào)用這個(gè)方法,fun(a,b),機(jī)器如何判斷我們是調(diào)用哪一個(gè)呢?結(jié)論:不要讓機(jī)器做不確定的事情。
父類引用指向子類對(duì)象① 向上轉(zhuǎn)型:將一個(gè)子類的引用賦給一個(gè)超類變量,編譯器是允許的,不用進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
格式: 超類 超類變量 = new 子類 ();
② 向下轉(zhuǎn)型:但是將一個(gè)超類的引用賦給 一個(gè)子類變量,必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換,這樣才能夠通過(guò)運(yùn)行時(shí)的檢查
格式: 子類 子類對(duì)象變量名 =(子類) 父類對(duì)象引用
結(jié)論:當(dāng)超類類變量引用子類對(duì)象
訪問(wèn)成員變量時(shí):訪問(wèn)的是父類的成員變量
訪問(wèn)成員方法時(shí):先訪問(wèn)的是超類的此方法,如果此方法被子類覆蓋,則調(diào)用子類的方法。并且不能訪問(wèn)子類特有的方法
父類
子類
輸出結(jié)果:
>>>Python 和 Java 基礎(chǔ)對(duì)比 09 —— 類的介紹
總結(jié)
以上是生活随笔為你收集整理的多重继承_Python 和 Java 基础对比 10 —— 类的封装、继承和多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: golang jwt设置过期_听说你的J
- 下一篇: matlab main函数_Python