中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中封裝、繼承和多態的示例分析

發布時間:2021-05-31 09:52:35 來源:億速云 閱讀:119 作者:小新 欄目:開發技術

這篇文章主要介紹Java中封裝、繼承和多態的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

封裝

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

Java中封裝、繼承和多態的示例分析

當我們使用的時候編譯器給出了下面這樣的報錯。

Java中封裝、繼承和多態的示例分析

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

Java中封裝、繼承和多態的示例分析
Java中封裝、繼承和多態的示例分析

有了上面的基礎我們現在再來看private,他的使用范圍只有 同一個包中的同一個類中使用(這個范圍也就是他的權限),我們就記住只能在我們定義的那個類中使用就好了,別問為什么,因為這就是語法,記住就好了,記準確了是當前類中,不能外部引用,否則就會出現上面那樣的報錯。既然不能直接從外部引用,那么類的調用者總得有個辦法使用吧,不然實現這個類干嘛,這個時候就是我們在設計類的時候要提供的公開的方法了,那么上述的代碼應該寫成如下形式。

Java中封裝、繼承和多態的示例分析

Java中封裝、繼承和多態的示例分析

ps:這里重寫了toString方法才會是下面的輸出形式。
上面就是調用了,那么有的讀者可能就會問了,那你的eat方法還是private的呀,我還是不能調用啊,這里我解釋一下,這是因為我是為了演示private的作用而在eat方法前面加的private,運行時我將它注釋掉了,至于實際上像eat這樣需要被類的調用者直接使用的方法,肯定是不能使用private修飾的,至于用什么訪問權限修飾這就是類的設計者根據日后業務的需要而決定了。
封裝的第一個作用就是為了不直接被外部使用,提高代碼的安全性,第二個作用就是降低類的使用者的學習成本,不需要知道類的實現,只需要學會調用就好了,封裝差不多就介紹完了,接下來聊聊繼承。

繼承

所謂繼承本質就是實現代碼的復用,防止重復的代碼多次書寫,當一個類繼承一個類的時候,該類中就會擁有另外一個類中的所有代碼,舉個例子看下面代碼

Java中封裝、繼承和多態的示例分析

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

Java中封裝、繼承和多態的示例分析

下面講的普通類繼承知識都是基于父類是公開的并單獨位于一個.java文件的。
我們定義一個這樣的Animal類當作父類:

Java中封裝、繼承和多態的示例分析

當訪問使用private修飾的屬性時就會報錯,這個就是上面封裝的知識了,只能在定義的類中使用。

Java中封裝、繼承和多態的示例分析

當去掉private不加任何修飾符時為包訪問權限(對應上面的default范圍,至于default關鍵字的使用在接口當中會提到),當前包底下的類才能使用Animal中的屬性。

Java中封裝、繼承和多態的示例分析
Java中封裝、繼承和多態的示例分析

當使用protected修飾時,是可以在子類中調用的,那么下面為什么會報錯呢,那是因為調用的方式不對,這里我們需要改變訪

問方式并使用到super關鍵字。

Java中封裝、繼承和多態的示例分析
Java中封裝、繼承和多態的示例分析

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

Java中封裝、繼承和多態的示例分析

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

Java中封裝、繼承和多態的示例分析
Java中封裝、繼承和多態的示例分析

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

Java中封裝、繼承和多態的示例分析
Java中封裝、繼承和多態的示例分析

繼承主要是為了代碼的復用,減少代碼的重復書寫和為多態打一個基礎,接下來我們聊聊多態

多態

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

Java中封裝、繼承和多態的示例分析
Java中封裝、繼承和多態的示例分析

Teacher是People的一個子類,使用People引用引用一個Teacher對象,向上轉型是自動發生的,不需要進行強制類型轉換,發生向上轉型一般有三種情況
1.像上面代碼一樣,讓父類引用直接引用子類對象時。
2.子類作為函數調用時的實參,使用父類形參接收時。
3.子類作為父類返回值函數的返回值時。
總的說就是父類引用引用了子類對象

Java中封裝、繼承和多態的示例分析

紅色的框表示第二種,橘黃色的框表示第三種
ps:不難理解吧QAQ
與向上轉型對應的還有向下轉型,就是將父類對象賦值給子類引用,一般很少用的,就簡單的提一下吧,因為他發生條件比較嚴格,首先是不能直接強制類型轉換,看下面代碼(已經將People類變成了類)

Java中封裝、繼承和多態的示例分析

其次是需要父類引用引用子類的對象(發生過向上轉型),最后需要強制轉換為對應的子類對象,像下面這樣

Java中封裝、繼承和多態的示例分析

ps:這東西用起來挺奇怪的,不太建議使用

到這里相信你應該知道什么叫做向上轉型了,但是這還不足以接觸多態,我們需要先來聊聊另外一個知識點,動態綁定,所謂動態綁定也叫運行時綁定,我們先來看看代碼

Java中封裝、繼承和多態的示例分析

Java中封裝、繼承和多態的示例分析

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

Java中封裝、繼承和多態的示例分析

是不是覺得很神奇,明明是指向了同一份代碼卻打印了不同的結果,這就是多態,我不管你怎么實現的方法,只要你有這個方法我就能幫你調用,并且這里如果是子類對象會發生向上轉型,進而發生動態綁定,形成多態,上面是通過繼承來實現的多態,接下來我們再來講一個東西實現多態,接口

接口

那么接口是什么呢,接口也可以想象成一個類,但是它既然單獨出現,肯定說明它和類有有所不同,首先接口由interface關鍵字定義,并且其中的所有方法都默認為public abstract的,所有字段都默認為public static final的,下面幾種定義方式并無區別,

Java中封裝、繼承和多態的示例分析

然后類似與繼承,接口可以通過implements被實現,實現也很簡單,和繼承抽象類一樣重寫所有的抽象方法即可,同樣接口不

能被直接實例化。

Java中封裝、繼承和多態的示例分析

有了上面的了解,我們來用接口實現多態,看下面代碼,也和類實現多態沒什么很大區別,也類似與發生了向上轉型和動態綁定,實現接口和繼承類的一個很大區別就是一個類只能繼承一個類,但是一個類可以實現多個接口
Java中封裝、繼承和多態的示例分析
Java中封裝、繼承和多態的示例分析
其中接口也可以擴展接口,看下面代碼
Java中封裝、繼承和多態的示例分析
從jdk1.8開始接口中可以包含默認方法了需要使用default關鍵字修飾,和類的成員方法一樣,看下面代碼,到這里接口就差不多聊完了,小結一下
Java中封裝、繼承和多態的示例分析

一些建議和小結

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

以上是“Java中封裝、繼承和多態的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克什克腾旗| 喀喇沁旗| 遵化市| 赤城县| 安泽县| 栾城县| 南川市| 沂水县| 临泉县| 湖南省| 汽车| 桦南县| 台南市| 蒙山县| 伊宁县| 沁阳市| 玉门市| 新竹县| 宣武区| 乌兰察布市| 杭锦旗| 宝坻区| 唐山市| 哈尔滨市| 盱眙县| 五常市| 利川市| 措美县| 威信县| 彭山县| 舒城县| 塘沽区| 台南县| 南乐县| 宿松县| 清水河县| 安顺市| 保康县| 武川县| 道孚县| 新巴尔虎右旗|