欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的封裝、繼承和多態(tài),你真的都懂了嗎

 更新時(shí)間:2021年05月29日 11:44:39   作者:JunFengYiHan  
Java中的封裝、繼承和多態(tài)知識(shí)點(diǎn)是學(xué)習(xí)java必備的基礎(chǔ)知識(shí),看似簡(jiǎn)單,真正理解起來(lái)還是有一定難度的,今天小編再次通過(guò)實(shí)例代碼給大家講解java 封裝繼承多態(tài)知識(shí),感興趣的朋友一起學(xué)習(xí)下吧

封裝

所謂的封裝就是把類的屬性和方法使用private修飾,不允許類的調(diào)用者直接訪問(wèn),我們定義如下一個(gè)類,可以看到所有的成員變量和成員方法都使用private修飾了,我們現(xiàn)在來(lái)使用一下這個(gè)類。

在這里插入圖片描述

當(dāng)我們使用的時(shí)候編譯器給出了下面這樣的報(bào)錯(cuò)。

在這里插入圖片描述

告訴我們說(shuō)是private訪問(wèn)控制,那么這是什么意思呢?我們來(lái)看看另外一張圖,那么這張圖代表這什么呢?在看這張圖之前,我們先來(lái)看看四者都提到的包,那么包又是什么呢,包可以簡(jiǎn)單理解為一個(gè)文件夾,把類放到放到包里面,也就相當(dāng)于是專門的文件夾里面,這不是我們說(shuō)的重點(diǎn),知道就行,類都知道吧,不知道的先去看看博主這篇博客類和對(duì)象再回來(lái)繼續(xù)往下。
ps:稍微記一下這張圖中的內(nèi)容。

在這里插入圖片描述
在這里插入圖片描述

有了上面的基礎(chǔ)我們現(xiàn)在再來(lái)看private,他的使用范圍只有 同一個(gè)包中的同一個(gè)類中使用(這個(gè)范圍也就是他的權(quán)限),我們就記住只能在我們定義的那個(gè)類中使用就好了,別問(wèn)為什么,因?yàn)檫@就是語(yǔ)法,記住就好了,記準(zhǔn)確了是當(dāng)前類中,不能外部引用,否則就會(huì)出現(xiàn)上面那樣的報(bào)錯(cuò)。既然不能直接從外部引用,那么類的調(diào)用者總得有個(gè)辦法使用吧,不然實(shí)現(xiàn)這個(gè)類干嘛,這個(gè)時(shí)候就是我們?cè)谠O(shè)計(jì)類的時(shí)候要提供的公開(kāi)的方法了,那么上述的代碼應(yīng)該寫成如下形式。

在這里插入圖片描述

在這里插入圖片描述

ps:這里重寫了toString方法才會(huì)是下面的輸出形式。
上面就是調(diào)用了,那么有的讀者可能就會(huì)問(wèn)了,那你的eat方法還是private的呀,我還是不能調(diào)用啊,這里我解釋一下,這是因?yàn)槲沂菫榱搜菔緋rivate的作用而在eat方法前面加的private,運(yùn)行時(shí)我將它注釋掉了,至于實(shí)際上像eat這樣需要被類的調(diào)用者直接使用的方法,肯定是不能使用private修飾的,至于用什么訪問(wèn)權(quán)限修飾這就是類的設(shè)計(jì)者根據(jù)日后業(yè)務(wù)的需要而決定了。
封裝的第一個(gè)作用就是為了不直接被外部使用,提高代碼的安全性,第二個(gè)作用就是降低類的使用者的學(xué)習(xí)成本,不需要知道類的實(shí)現(xiàn),只需要學(xué)會(huì)調(diào)用就好了,封裝差不多就介紹完了,接下來(lái)聊聊繼承。

繼承

所謂繼承本質(zhì)就是實(shí)現(xiàn)代碼的復(fù)用,防止重復(fù)的代碼多次書寫,當(dāng)一個(gè)類繼承一個(gè)類的時(shí)候,該類中就會(huì)擁有另外一個(gè)類中的所有代碼,舉個(gè)例子看下面代碼

在這里插入圖片描述

可以看到繼承的語(yǔ)法形式是class 子類名 extends 父類名,繼承類就是子類,也叫派生類,被繼承的類稱為父類,基類或者超類(名字一般不做區(qū)分,均可使用),語(yǔ)法形式很簡(jiǎn)單,我們來(lái)聊聊其中的細(xì)節(jié),首先Java是單繼承的, 一個(gè)子類只能有一個(gè)父類,但是一個(gè)子類可以當(dāng)作另外一個(gè)類的父類,即可以B繼承A,然后C繼承B,代碼如下,那么B會(huì)擁有A中的代碼,C會(huì)擁有A、B的代碼。

在這里插入圖片描述

下面講的普通類繼承知識(shí)都是基于父類是公開(kāi)的并單獨(dú)位于一個(gè).java文件的。
我們定義一個(gè)這樣的Animal類當(dāng)作父類:

在這里插入圖片描述

當(dāng)訪問(wèn)使用private修飾的屬性時(shí)就會(huì)報(bào)錯(cuò),這個(gè)就是上面封裝的知識(shí)了,只能在定義的類中使用。

在這里插入圖片描述

當(dāng)去掉private不加任何修飾符時(shí)為包訪問(wèn)權(quán)限(對(duì)應(yīng)上面的default范圍,至于default關(guān)鍵字的使用在接口當(dāng)中會(huì)提到),當(dāng)前包底下的類才能使用Animal中的屬性。

在這里插入圖片描述
在這里插入圖片描述

當(dāng)使用protected修飾時(shí),是可以在子類中調(diào)用的,那么下面為什么會(huì)報(bào)錯(cuò)呢,那是因?yàn)檎{(diào)用的方式不對(duì),這里我們需要改變?cè)L

問(wèn)方式并使用到super關(guān)鍵字。

在這里插入圖片描述
在這里插入圖片描述

改為如下調(diào)用,在子類中調(diào)用,并使用super關(guān)鍵字,而不是通過(guò)實(shí)例化對(duì)像調(diào)用,上面那張圖除了提到包還提到了類,小伙伴們注意到了嗎?不記得的小伙伴們就往上翻再看看那張圖吧。

在這里插入圖片描述

至于public沒(méi)啥好說(shuō)的,哪都能用。
上面呢介紹了繼承普通類的知識(shí),現(xiàn)在我們來(lái)看看不太正常的類,抽象類,抽象類是指被abstract修飾,包含抽象方法的類,如下就是一個(gè)抽象類,首先是類名前面添加了abstract關(guān)鍵字,其次是其中包含了一個(gè)抽象方法,什么是抽象方法,就是沒(méi)有被具體實(shí)現(xiàn)的方法,如下圖的work方法,沒(méi)有方法體,并被abstract修飾,不加的話會(huì)報(bào)錯(cuò),被abstract修飾的類中可以沒(méi)有抽象方法,這是語(yǔ)法允許的(jdk1.8測(cè)出來(lái)的),但是建議同步使用,要么既有abstract修飾類又有abstract方法,要么都沒(méi)有,不然使用了abstract修飾類又不加abstract方法這不是鬧嗎,除非你不想這個(gè)類直接被實(shí)例化,注意一點(diǎn),abstract修飾的類不能直接被實(shí)例化,需要被繼承之后通過(guò)子類調(diào)用父類的構(gòu)造方法,對(duì)從父類繼承過(guò)來(lái)的字段進(jìn)行初始化,注意這些繼承過(guò)來(lái)的字段和方法都到了子類中了,但是子類能不能使用和如何使用就和給的權(quán)限(使用了什么訪問(wèn)修飾符限定)相關(guān)了,并沒(méi)有實(shí)例化產(chǎn)生一個(gè)父類對(duì)象,有些地方說(shuō)會(huì)實(shí)例化一個(gè)父類對(duì)象這是不對(duì)的,說(shuō)一個(gè)極端的說(shuō)法,父類為抽象類你能實(shí)例化嗎?

在這里插入圖片描述
在這里插入圖片描述

當(dāng)一個(gè)普通類繼承一個(gè)抽象類的時(shí)候需要重寫抽象類的所有抽象方法,如果不想重寫的話就需要聲明為抽象類,看下面代碼

在這里插入圖片描述
在這里插入圖片描述

繼承主要是為了代碼的復(fù)用,減少代碼的重復(fù)書寫和為多態(tài)打一個(gè)基礎(chǔ),接下來(lái)我們聊聊多態(tài)

多態(tài)

多態(tài)是一種思想,是同一份代碼,不同的傳參(子類)調(diào)用會(huì)產(chǎn)生不同的效果,絕對(duì)不是寫死的代碼
多態(tài)是建立在繼承機(jī)制上的一種機(jī)制,想要了解多態(tài)就必須知道向上轉(zhuǎn)型,那么什么是向上轉(zhuǎn)型呢,所謂的向上轉(zhuǎn)型就是使用父類對(duì)象的引用,引用子類對(duì)象看下面代碼

在這里插入圖片描述
在這里插入圖片描述

Teacher是People的一個(gè)子類,使用People引用引用一個(gè)Teacher對(duì)象,向上轉(zhuǎn)型是自動(dòng)發(fā)生的,不需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,發(fā)生向上轉(zhuǎn)型一般有三種情況
1.像上面代碼一樣,讓父類引用直接引用子類對(duì)象時(shí)。
2.子類作為函數(shù)調(diào)用時(shí)的實(shí)參,使用父類形參接收時(shí)。
3.子類作為父類返回值函數(shù)的返回值時(shí)。
總的說(shuō)就是父類引用引用了子類對(duì)象

在這里插入圖片描述

紅色的框表示第二種,橘黃色的框表示第三種
ps:不難理解吧QAQ
與向上轉(zhuǎn)型對(duì)應(yīng)的還有向下轉(zhuǎn)型,就是將父類對(duì)象賦值給子類引用,一般很少用的,就簡(jiǎn)單的提一下吧,因?yàn)樗l(fā)生條件比較嚴(yán)格,首先是不能直接強(qiáng)制類型轉(zhuǎn)換,看下面代碼(已經(jīng)將People類變成了類)

在這里插入圖片描述

其次是需要父類引用引用子類的對(duì)象(發(fā)生過(guò)向上轉(zhuǎn)型),最后需要強(qiáng)制轉(zhuǎn)換為對(duì)應(yīng)的子類對(duì)象,像下面這樣

在這里插入圖片描述

ps:這東西用起來(lái)挺奇怪的,不太建議使用

到這里相信你應(yīng)該知道什么叫做向上轉(zhuǎn)型了,但是這還不足以接觸多態(tài),我們需要先來(lái)聊聊另外一個(gè)知識(shí)點(diǎn),動(dòng)態(tài)綁定,所謂動(dòng)態(tài)綁定也叫運(yùn)行時(shí)綁定,我們先來(lái)看看代碼

在這里插入圖片描述

在這里插入圖片描述

首先可以看到三個(gè)輸出,第一個(gè)輸出睡覺(jué),第三個(gè)輸出教書沒(méi)問(wèn)題吧,問(wèn)題就出在第二個(gè)上面,我明明調(diào)用的是people的work方法,為什么輸出的不是睡覺(jué),而是教書呢?這就是發(fā)生了動(dòng)態(tài)綁定,所謂動(dòng)態(tài)綁定就是使用父類引用引用子類對(duì)象然后(向上轉(zhuǎn)型)去調(diào)用父類和子類相同的方法(返回值(構(gòu)成父子類關(guān)系也可以,也就是協(xié)變類型),方法名,形參列表完全相同)換句話說(shuō)也就是說(shuō)在子類中重寫了父類的方法,這樣的重寫需要注意一些點(diǎn),那就是子類重寫的方法的訪問(wèn)權(quán)限必須不小于父類的方法的權(quán)限也就是說(shuō)父類為public子類就必須為public因?yàn)閜ublic是最大的權(quán)限,權(quán)限對(duì)應(yīng)上圖的 的個(gè)數(shù)√越多權(quán)限越大,靜態(tài)方法不能重寫,被final修飾的方法(密封方法)不能重寫。
ps:與動(dòng)態(tài)綁定對(duì)應(yīng)的還有靜態(tài)綁定,這里就不多說(shuō)了…
好了,知道了向上轉(zhuǎn)型和動(dòng)態(tài)綁定就可以了解多態(tài)了,看代碼

在這里插入圖片描述

是不是覺(jué)得很神奇,明明是指向了同一份代碼卻打印了不同的結(jié)果,這就是多態(tài),我不管你怎么實(shí)現(xiàn)的方法,只要你有這個(gè)方法我就能幫你調(diào)用,并且這里如果是子類對(duì)象會(huì)發(fā)生向上轉(zhuǎn)型,進(jìn)而發(fā)生動(dòng)態(tài)綁定,形成多態(tài),上面是通過(guò)繼承來(lái)實(shí)現(xiàn)的多態(tài),接下來(lái)我們?cè)賮?lái)講一個(gè)東西實(shí)現(xiàn)多態(tài),接口

接口

那么接口是什么呢,接口也可以想象成一個(gè)類,但是它既然單獨(dú)出現(xiàn),肯定說(shuō)明它和類有有所不同,首先接口由interface關(guān)鍵字定義,并且其中的所有方法都默認(rèn)為public abstract的,所有字段都默認(rèn)為public static final的,下面幾種定義方式并無(wú)區(qū)別,

在這里插入圖片描述

然后類似與繼承,接口可以通過(guò)implements被實(shí)現(xiàn),實(shí)現(xiàn)也很簡(jiǎn)單,和繼承抽象類一樣重寫所有的抽象方法即可,同樣接口不

能被直接實(shí)例化。

在這里插入圖片描述

有了上面的了解,我們來(lái)用接口實(shí)現(xiàn)多態(tài),看下面代碼,也和類實(shí)現(xiàn)多態(tài)沒(méi)什么很大區(qū)別,也類似與發(fā)生了向上轉(zhuǎn)型和動(dòng)態(tài)綁定,實(shí)現(xiàn)接口和繼承類的一個(gè)很大區(qū)別就是一個(gè)類只能繼承一個(gè)類,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口
在這里插入圖片描述
在這里插入圖片描述
其中接口也可以擴(kuò)展接口,看下面代碼
在這里插入圖片描述
從jdk1.8開(kāi)始接口中可以包含默認(rèn)方法了需要使用default關(guān)鍵字修飾,和類的成員方法一樣,看下面代碼,到這里接口就差不多聊完了,小結(jié)一下
在這里插入圖片描述

一些建議和小結(jié)

1.建議字段的訪問(wèn)權(quán)限能給小絕不給大,能使用private修飾的字段一定要用private,提高安全性。
2.繼承的層次不要太深,建議最多繼承三層,使用final修飾可以讓類無(wú)法被繼承。
3.抽象類的出現(xiàn)就是為了繼承之后重寫發(fā)生動(dòng)態(tài)綁定。
4.能使用接口就不要使用抽象類,因?yàn)轭愔荒軉卫^承,但是接口可以“多繼承”,更加的靈活。
5.多態(tài)的核心都是讓調(diào)用者不必關(guān)注對(duì)象的具體類型. 這是降低用戶使用成本的一種重要方式。
6.抽象類和接口的核心區(qū)別: 抽象類中可以包含普通方法和普通字段, 這樣的普通方法和字段可以被子類直接使用(不必重寫), 而接口中不能包含普通方法, 子類必須重寫所有的抽象方法。
7.接口中的方法和字段定義都只寫必要部分,盡量簡(jiǎn)潔像博主上面一樣

寫在最后的話

以上就是博主這段時(shí)間學(xué)習(xí)的主要內(nèi)容了,也查了不少資料,限于博主水平有限,文章難免有說(shuō)錯(cuò)或表述不清的地方,歡迎小伙伴們?cè)谠u(píng)論區(qū)或私信博主指出,最后希望本篇博客能對(duì)小伙伴們有所幫助,好了本篇博客到此就結(jié)束了,我們下篇博客見(jiàn)。

以上就是Java中的封裝、繼承和多態(tài),你真的都懂了嗎的詳細(xì)內(nèi)容,更多關(guān)于java 封裝繼承多態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java并發(fā)編程之對(duì)象的共享

    Java并發(fā)編程之對(duì)象的共享

    這篇文章主要介紹了Java并發(fā)編程之對(duì)象的共享,介紹如何共享和發(fā)布對(duì)象,使它們被安全地由多個(gè)進(jìn)程訪問(wèn)。需要的小伙伴可以參考一下
    2022-04-04
  • spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例

    spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例

    這篇文章主要介紹了spring boot下mybatis配置雙數(shù)據(jù)源的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • struts2的國(guó)際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼

    struts2的國(guó)際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼

    本篇文章主要介紹了struts2的國(guó)際化實(shí)現(xiàn)網(wǎng)站整體中英文切換實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Java 集合的Contains和Remove方法

    Java 集合的Contains和Remove方法

    這篇文章主要介紹了Java 集合Contains和Remove方法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • 解決idea的debug模式突然變卡,項(xiàng)目啟動(dòng)變慢的狀況

    解決idea的debug模式突然變卡,項(xiàng)目啟動(dòng)變慢的狀況

    這篇文章主要介紹了解決idea的debug模式突然變卡,項(xiàng)目啟動(dòng)變慢的狀況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • 深度解析Spring內(nèi)置作用域及其在實(shí)踐中的應(yīng)用

    深度解析Spring內(nèi)置作用域及其在實(shí)踐中的應(yīng)用

    這篇文章主要詳細(xì)介紹了Spring內(nèi)置的作用域類型及其在實(shí)踐中的應(yīng)用,文中有詳細(xì)的代碼示例,對(duì)我們的餓學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的同學(xué)可以借鑒閱讀
    2023-06-06
  • java中SPI服務(wù)提供者的接口使用總結(jié)

    java中SPI服務(wù)提供者的接口使用總結(jié)

    SPI英文全稱為Service?Provider?Interface,顧名思義,服務(wù)提供者接口,它是jdk提供給“服務(wù)提供廠商”或者“插件開(kāi)發(fā)者”使用的接口
    2022-02-02
  • Java基于Guava Retrying實(shí)現(xiàn)重試功能

    Java基于Guava Retrying實(shí)現(xiàn)重試功能

    這篇文章主要介紹了Java基于Guava Retrying實(shí)現(xiàn)重試功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • springboot中如何使用openfeign進(jìn)行接口調(diào)用

    springboot中如何使用openfeign進(jìn)行接口調(diào)用

    這篇文章主要介紹了springboot中如何使用openfeign進(jìn)行接口調(diào)用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java8中Optional的使用方法詳解

    Java8中Optional的使用方法詳解

    這篇文章主要介紹了Java8中Optional的使用方法詳解,傳統(tǒng)的寫代碼方式經(jīng)常會(huì)遇到NullPointerException,這就需要我們?cè)诖a中經(jīng)常判空,而判空的寫法又會(huì)顯得很累贅,這里就可以用到Optional來(lái)簡(jiǎn)化代碼,需要的朋友可以參考下
    2024-01-01

最新評(píng)論