面向對象系列五
一、引用
1.自調傳自與this類型
2.類變量引用
3.重寫時的發生
二、Object類
1.toString
2.equals
3.hashCode
4.clone
三、排序規則接口
一、引用
1.自調傳自與this類型
似復刻變量調用里面的非靜態方法時,都是自調傳自,自己選擇去調用哪個非靜態方法并將自己傳過去,每一個非靜態方法里的this就是接調用者的,所以,誰去調用這個非靜態方法的,非靜態方法里的this就是誰,但this能不變的只有傳值對象頭是確定的,經常會有發生轉型的,this形參的類型是此非靜態方法所屬的類的類變量引用類型
2.類變量引用
類變量引用是能掌握此所指似復刻變量里的成員、方法路徑信息的訪問的,類變量引用的對象是似復刻變量,向上轉型向下轉型是發生在類變量引用指似復刻變量層面的
引用變量,里面裝所指對象的頭地址,配合此引用變量類型的訪問權限性質進行訪問的,向上轉型與向下轉型是一個引用變量里引用類型的轉換,對象頭存著,引用類型引用訪問權限性質的改變,父子類類變量引用中常常拿著當前似復刻變量對象的對象頭去互接去實現對應的整個父子合起來的似復刻變量、單父類似復刻變量的訪問,其中,對象頭地址是交接著它傳它接不變的,始終指向這塊對象的地址頭,變的是子類類變量引用下、父類類變量引用下的引用訪問權限,影響到最后訪問的效果
(類變量、似復刻變量可參考面向對象系列一【Java學習】類和對象-CSDN博客)
3.重寫時的發生
重寫是轉型后的父類類變量引用傳自己去調用父類里被重寫的方法時發生的,發生時的調用現象是轉型后的父類類變量引用傳接到隱藏的this父類類變量形參,這時發生方法重寫,此轉型后的父類類變量引用直接向下轉型為子類類變量引用類型直接this權限全開為整個對象并去調用子類那邊重寫的方法,因為重寫的兩方法是相同的,隱藏形參this外的其它形參都是正常傳
所以子類這邊super()去調用父類那邊的被重寫的方法時,父類隱藏形參那邊是有發生向上轉型,但重寫發生的條件是向上轉型后的類變量引用去傳自己去調用父類的那個被重寫的方法,轉型后的父類類變量引用傳到用被重寫方法的父類類變量引用接發生的,所以子類這邊傳子類似復刻變量自己super指向父類非靜態方法調用時是去指向父類的被重寫的方法執行父類被重寫本身的方法而不會發生重寫去執行子類那邊的方法
二、Object類
Object類是所有類的父類,所有的類都有默認繼承了Object類,Object類里面有很多方法提供給任何一個正常類繼承著可以去使用的,但我們常常在子類里重寫在默認父類里的這些方法對應實現上針對實際所需情況
- Object類里的方法都是非靜態方法,哪個似復刻變量去調用的里面的this就是哪個轉型后的似復刻變量引用
- Object類里面都是有具體實現的非靜態方法,是沒有抽象方法的正常類,是可以直接實例化的
1.toString
1.1Object里原方法:
- getClass().getName() -> 返回調用者當前對象當前似復刻變量的類的包名類名全路徑
- Integer.toHexString(hashCode()) -> 返回當前調用它的似復刻變量哈希碼值(一個整數)的十六進制
返回當前似復刻變量對象所屬于的類所在的包名類名@當前似復刻變量對象的哈希碼值的十六進制
1.2子類里重寫方法:
更改實現成返回獲取當前似復刻變量里復制變量信息
2.equals
2.1Object里原方法:
引用類型數據==拿去判斷的是引用變量里裝的對象頭哈希值這個值而與它的訪問權限性質無關的,即比較是不是指向在同一個對象頭,純值拿來比較,與性質無關
2.2子類里重寫方法:
重寫后的方法比較重心不在是不是指向同一個對象頭上同一個對象上,而是比較兩引用所指對象里的復制變量數據是否相等
3.hashCode
3.1Object里原方法:
一個對象放在一個地址空間上
未重寫hashCode之前,hashCode方法是基于對象地址內容分配所處內存位置并計算內存位置哈希碼值并返回,如果重寫了equals方法,就會出現判斷成是同一個的一個對象的出現在兩個不同的地址空間上,同一個的一個對象是只能出現在一個地址空間上的,所以equals重寫判斷對象相等的標準之后,hashCode分配對象所處空間的標準也要跟著變,用新的equals判斷標準來分配空間,原來它們都是共用地址同一塊標準的,現在的相等與分配也要改成相同判斷依據保持一致,所以要重寫hashCode方法,將它的內存分配依據從原來的地址改成與現在重寫的equals判斷相等的依據一樣
3.2子類里重寫方法:
以新的分配標準分配對象內存并計算其內存位置哈希碼值返回
4.clone
4.1Object里原方法:
Object類中有提供由本地實現的克隆方法,將調用它的對象傳過來的this里的對象頭指向的原對象全部拷貝一份在堆上(克隆只能對傳來的this指向的整對象克隆說明只能克隆類變量創的似復刻變量、克隆只需要對象頭地址,不需要它所在的引用的訪問權限,有對象頭地址就可把整個對象全克隆拷貝一份出來),拷貝出來后的似復刻變量再通過返回值轉型都能統一向上轉型為Object類的引用以統一的返回值返回出來實現方法的共用,因為向上轉型為Object類變量引用了,方法將Object類引用返回后我們要通過強轉向下轉型回原來克隆出的對象拿到
4.2基于Object原方法
我們我們的克隆都是基于Object類里的那個本地克隆方法實現的,它不是抽象方法不是一定要重寫,直接從子類調用Object父類里的那個方法就行了,去實現重寫時往往是因為要根據實際拷貝需求自己再重寫去調整拷貝設計的,重寫的方法也是在重寫方法里去調用Object類里原生提供的克隆方法進行的,重寫方法時我們可以根據需求把似復刻變量以及如果里面也有裝似復刻變量一起深層地把所有似復刻變量都拷貝出來達到深拷貝
4.3clone使用條件
需要實現克隆功能的類僅僅有Object類繼承方法提供克隆方法下也還是不夠的:
- 需要連接Cloneable空接口來標記此類允許被克隆的
- 有關克隆的任何方法都需要加上 throws CloneNotSupportedException
三、排序規則接口
接口、抽象類都是不能直接對著它實例化的,必須通過連接繼承在一個正常類上,通過實例化正常類間接實例化上它們,無法new接口,無法對著接口直接new實例化的,接口的實例化只能通過new連接有它的子類來間接實例化上接口(接口里有抽象方法非靜態的需要實例化的才可調用才可傳有參才可使用)
基本數據類型元素的數組排序規則是默認已經有定的,似復刻變量類型元素的數組沒有默認排序規則的,需要我們連接比較接口,重寫實現有比較的排序規則給sort用
1.Comparable<T>
Comparable<T>接口與要實現排序類變量的似復刻變量功能的那個類直接連接的,對類的入侵性強
接口里原方法:
子類里重寫方法:
接口變量里面抽象方法的形參Object任何類的父類類變量,子類重寫方法的形參是必須為T
這樣對象就算從接口向上轉型導入執行被重寫的抽象方法也能實現:
- 隱藏形參里,隱藏形參里向上轉型后的父類引用過重寫方法自動完成向下轉型權限全打開成為子類引用,先形參轉接向上轉型再重寫向下轉型回來
- Object o與 T o 形參里,任何類變量引用傳到接口Object類變量引用都會發生形參轉接向上轉型,因為<T>強制規定了子類這邊重寫方法的形參必須是T,向上轉型后的父類類變量引用又會進行強制類型轉換向下轉型轉成子類類變量引用(如果傳參的子類類變量引用類型剛開始就不與T相同的,向上轉型時沒什么問題,向下轉型后就會報錯發現轉不了傳入的不是規定的T引用類型而停下報錯),子類實例以接口導入能實現的從子類實例直接調用重寫方法肯定也能實現
2.Comparator<T>
Comparator<T>接口可連接在單獨出來的比較器類上的,不需要連接在要實現排序規則的類上,連接在一個專門實現比較規則的比較器類上做出一個獨立出來的提供比較規則的類,為需要排序的類變量似復刻變量數組sort排序時作為參數多傳一個比較器類的實例似復刻變量參數提供sort方法的排序規則