日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

细品java封装继承多态

發布時間:2024/10/14 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 细品java封装继承多态 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄:
1.封裝
2.繼承
3.多態

1.封裝

封裝的作用:封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性的方法,如果屬性不想被外界訪問,我們大可不必提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那么這個類也沒有什么意義了。

說成大白話就是防止別人更改你的變量

(2)訪問修飾符:

一般修飾類的話只能是默認的default和public

1.private : 在同一類內可見。使用對象:變量、方法。 注意:不能修飾類外部類(可以修飾內部類)
2.default (即缺省,什么也不寫,不使用任何關鍵字): 在同一包內可見,不使用任何修飾符。使用對象類、接口、變量、方法。
3.protected : 對同一包內的類和所有子類可見。使用對象:變量、方法。 注意:不能修飾類外部類(可以修飾內部類)
4.public : 對所有類可見。使用對象:類、接口、變量、方法

2.繼承

(1)繼承的定義

繼承:就是子類繼承父類的屬性和行為,使得子類對象具有與父類相同的屬性、相同的行為。子類可以直接訪問父類中的非私有的屬性和行為。

這里再聲明一點,父類又稱為超類或者基類。而子類又稱為派生類,而且java只支持單繼承不支持多繼承這點很重要

(2)繼承的優點:

1.提高代碼的復用性。
2.類與類之間產生關系,為多態做了完美的鋪墊

(3)繼承格式

class A extends B{ }

(4)繼承后的成員變量重名問題

可以使用super和this來分別調用
如圖:

這里注意一點不要在主函數里邊直接用super.+方法名可能會報錯,因為main是靜態方法

(5)成員方法重名
方法重名大體也可以分兩種情況:

1、方法名相同返回值類型、參數列表卻不相同(優先在子類查找,沒找到就去父類)
2、方法名、返回值類型、參數列表都相同,沒錯這就是重寫(Override)

這里注意方法名相同不一定就是重寫

重寫的意義:

1、方法重寫時, 方法名與形參列表必須一致。
2、子類方法覆蓋父類方法時,必須要保證子類權限 >= 父類權限。
3、方法重寫時,子類的返回值類型必須要 <= 父類的返回值類型。
4、方法重寫時,子類拋出的異常類型要 <= 父類拋出的異常類型。

(6)繼承之后的構造函數

構造方法的名字是與類名一致的,所以子類是無法繼承父類構造方法的
構造方法的作用是初始化成員變量的。所以子類的初始化過程中,必須先執行父類的初始化動作子類的構造方法中默認會在第一句代碼中添加super(),表示調用父類的構造方法,父類成員變量初始化后,才可以給子類使用。

當然我已經強調很多遍了 super() 不寫也默認存在,而且只能是在第一句代碼中,不在第一句代碼中行不行,答案是當然不行

(7)繼承后關于super和this

了解他們的用法之前必須明確一點的是父類空間優先于子類對象產在每次創建子類對象時,先初始化父類空間,再創建其子類對象本身。目的在于子類對象中包含了其對應的父類空間,便可以包含其父類的成員,如果父類成員非private修飾,則子類可以隨意使用父類成員。代碼體現在子類的構 造方法調用時,一定先調用父類的構造方法。

(7)類的每個構造方法中均有 默認的super(),調用父類的空參構造。手動調用父類構造會覆蓋默認的super()。

super() 和 this() 都必須是在構造方法的第一行,所以不能同時出現。

3.多態

(1)多態定義:
高級定義:

程序中定義的引用變量所指向具體的類型和通過該引用變量發出的方法調用在編程時并不確定,而是在程序運行期間才確定,就叫多態

簡單定義:

多態指同一行為具有多種不同的表現形式

(2)多態三個前提:
繼承或者實現【二選一】

1.方法的重寫【意義體現:不重寫,無意義】,子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。
2.父類引用指向子類對象(也可以說向上轉型)【體現在格式上】

(3)多態的體現:
多態體現的格式:

父類/父接口類型 變量名 = new 子類對象; 變量名.方法名()

當使用多態調用方法的時候首先檢查父類中是否有該方法,如果沒有則編譯錯誤,如果有執行的是子類重寫后的方法(重中之重)

子類單獨定義方法丟失問題:

再來細品這一句話:
當使用多態調用方法的時候首先檢查父類中是否有該方法,如果沒有則編譯錯誤,如果有執行的是子類重寫后的方法

來看一道題:

這應該會打印什么:

有些聰明機智的童鞋已經想到了,那些邊看博客邊走神的童鞋還在那想

一部分童鞋已經饑渴難耐,迫不及待的回答這還不簡單肯定打印“我要走回學校”

博主此時亮出來答案:

此時很多童鞋想垃圾博主寫的什么垃圾結論還讓我們看兩遍

好了你們別嘀咕了且聽我慢慢扯來:

首先這是爺子輩的引用指向子類對象,當爺子輩的引用調用方法的時候會先找自己的子類,其實子類B里邊沒有定義任何東西,所以那么這就是你們覺得是調用爺子輩fly的原因了吧

but別忘了繼承啊,此時B里邊是有fly方法的,從你爺爺那繼承過來的,然后你爸爸還要找找自己的子類,發現你是它失散多年的兒子,它看看你有沒有fly你要是有的話就調用你的(由于你連女朋友都沒有所以你沒有后代),如果你沒有,你就繼承你爸爸的一份,然后再調用你的,懂了伐。。。。。

(4).靜態、動態綁定本質區別:

1、靜態綁定是發生在編譯階段;而動態綁定是在運行階段;
2、靜態綁定使用的是類信息,而動態綁定使用的是對象信息

先看一個例子:

此時聰明的童鞋們都異口同聲地回答這不就是簡單多態嗎,肯定會輸出“我要飛回學校啊”

此時博主已經急了,感覺打斷你們地思路悄悄地放出來答案

垃圾博主不看了,走走走兄弟們

哎哎哎再給我一次機會童鞋們

誒呀那么猴急干嘛,這不是給你們講靜態綁定呢嗎,細看代碼會發現父類和子類地方法中帶了static這就是所謂地靜態綁定,而以前不加地時候是動態綁定,再細細品味兩者地區別,你就會發現其實靜態綁定就是一開始就已經知道我要調用哪一個,因為程序還沒運行,所以系統就默認只要是父類地引用就調用父類的方法,但是動態綁定就不一樣了,動態綁定是在運行階段綁定,運行到父類引用調用方法時會動態的去搜索子類有沒有重寫這個方法,然后決定執行哪一個這就是多態

還有一個地方需要補充:

重載是靜態綁定,重寫是靜態綁定

(5)虛方法:
這垃圾博主有扯無大聊的(就是沒有用的)
不不不這與多態息息相關

可以把java中被重寫的方法稱為虛方法

(6)向上向下轉型(子類對象強制轉換成父類對象時并沒有丟失他原有的內存空間只是暫時不可以訪問了所以可以再轉回成子對象)
向上轉型就是父類引用指向子類對象這個好理解
到這里,我們講解一下為什么要向下轉型,上面已經講到過當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤。也就是說,不能調用子類擁有,而父類沒有的方法。編譯都錯誤,更別說運行了。這也是多態給我們帶來的麻煩。所以,想要調用子類特有的方法,必須做向下轉型。

這個時候我們的向下轉型就閃亮登場了


這樣func()就可以被調用了

注意只能存在繼承關系才能相互轉型,如果是不同的兩個類繼承了同一個類那么這兩個類是不能相互轉型的。還有一種向下轉型也不可取,就是一個父類的對象被強制轉換成一個子類的時候(當然也轉不成功),子類的引用是不能指向這個對象的,即子類引用不能指向父類對象

(7)instanceof的使用:
instanceof 運算符進行判斷,左邊是對象右邊是類,當對象是類或者子類創建的對象時,返回true,否則返回false;

注意這里的的instanceof的格式,兩邊必須有繼承關系,這是格式問題,如果左邊的對象和右邊的類毛線關系都沒有那么編譯器就會報錯,也就是說只有左邊是父類的對象右邊是類的時候才會返回false

(8)多態與構造器之間的妙用
看段代碼猜運行結果(又來這招垃圾博主打死不猜了,反正也猜不對)

好吧,博主就不賣關子了:

童鞋:就知道不按套路出牌,這垃圾博主

咳咳咳!!

好了別議論了
原因其實很簡單,因為在創建子類對象時,會先去調用父類的構造器,而父類構造器中==又調用了被子類覆蓋的多態方法==,
由于父類并不清楚子類對象中的屬性值是什么(先初始化父類的時候還沒開始初始化子類),

于是把String類型的屬性暫時初始化為默認值null,

然后再調用子類的構造器(這個時子類構造器已經初始Weight屬性,所以子類構造器知道熊孩子的體重Weight是250)。

好了我有點累了先休息一下

總結

以上是生活随笔為你收集整理的细品java封装继承多态的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。