來自韓順平,點選此處開始學習!
定義:super代表父類引用,用於引用父類的屬性和方法。
note:
訪問時不能訪問private屬性和方法,super.屬性名;super.方法名(引數);
2. super用於子類構造器的注意點:必須在構造器第一行,不能與this()共存在同一構造器,如果子類構造器不寫super或this則預設存在乙個super方法呼叫父類的無參構造器。對於子類中與父類同名的屬性或方法,使用this訪問子類,用super訪問父類。若不使用關鍵字使用子類中某一方法或屬性,遵循jvm繼承的記憶體模型規則:即1.先查早本類,有則直接呼叫。2.沒有則查其父類,有則呼叫,若有但是私有方法,則報錯。3.父類沒有則繼續往上查詢,直到object以此類推。3. super();只能用於子類的構造器第一行。
定義:子類有乙個方法和其父類的某個方法,名稱,引數列表都相同,但是方法體不同,則稱該子類重寫了父類。
note:
子類方法的名稱和引數列表要完全相同。
子類與父類的返回值不需一致,子類的返回值可以是父類返回值的子類(但不能是父類返回值的父類或不相關類,否則編譯報錯),也將構成重寫。如:父類返回 object類,子類返回string類
子類中不能縮小父類方法的訪問許可權。public > protected > default > private
overload與override的區別
簡單來說,多型就是指方法或物件有多種形態,多型是建立在封裝和繼承的基礎上的。
方法的多型,如過載和重寫。
物件的多型!(核心)
乙個物件的編譯型別和執行型別可以不一致
編譯型別在定義物件時,就確定了不能改變
執行型別可以改變
編譯型別看定義是 = 左邊,執行型別看 = 右邊
例子:
還有一種用法:在方法的引數列表中寫父類,但傳入子類作為引數,達到多型目的。
定義:父類的引用指向了子類的物件。
多型的前提是繼承關係。
本質:父類的引用指向子類
語法:父類型別 引用名 = new 子類型別();
特點:編譯型別看左邊,執行型別看右邊。
可以呼叫父類中的成員方法(需遵守訪問許可權),不能呼叫子類的特有成員屬性/方法,最終執行效果看子類的具體實現。(動態繫結
)因為在編譯階段,能呼叫那些成員,是由編譯型別決定的,所以在父類引用指向子類的例子中,引用物件如果直接呼叫子類特有成員,將會報錯無法通過編譯。但是,一旦編譯通過以後,開始執行時,則會將引用物件當作子類,遵循子類繼承的記憶體模型原則。舉個例子,呼叫方法時,如果子類(執行型別)對父類的方法進行了重寫,那麼父類的引用會呼叫子類重寫的方法。
語法:子類型別 引用名 = (子類型別)父類引用
只能強轉父類的引用,不能強轉父類的物件
要求父類的引用必須指向的是當前目標型別的物件(原來a的引用指向b,a才可以向下轉型為b),
a a = new b();//a的引用指向b向下轉型後,可以呼叫子類型別中所有的成員b b = (b)a;//向下轉型
//((b)a).show(); show()是b的獨有方法。
屬性與重寫無關,屬性值看編譯型別(等號左邊)
instanceof 比較操作符,用於判斷物件型別是否是xx型別或xx型別的子型別。(判斷的是執行型別)
注意:b == s;//true,判斷的是實際指向的物件是否一致。
當呼叫物件方法時,方法會和該物件的執行型別繫結,先從執行物件的類裡找方法,沒有再去父類找,遵循繼承記憶體模型。
當某一方法呼叫屬性時,沒有動態繫結,即該方法在哪兒,呼叫的屬性就在哪兒。(**宣告,**使用)
== 是乙個比較運算子
既可以判斷基本型別,又可以判斷引用型別
如果判斷基本型別,則判斷的是值是否相等
如果判斷的是引用型別,則判斷的是位址是否相等,即是否指向同一物件
equals方法是object的方法
只能判斷引用型別
預設的判斷是位址是否相同。
但jdk原始碼中有些類已經重寫了equals方法,如string integer,它們的equals比較的是值是否相等。
@override作用是提供具有雜湊結構容器的效率public boolean equals(object obj)
if (obj instanceof person)
return false;
}
兩個引用,如果指向的額是同乙個物件,則雜湊值肯定是一樣的
兩個引用,如果指向的是不同的物件,則雜湊值不一樣。
雜湊值主要是根據位址號來的,但不能完全將雜湊值等同於位址。
預設返回:全類名 + @ + 雜湊值的十六進製制 (即object的tostring方法)
重寫tostring方法,列印物件或拼接物件時,都會自動呼叫該物件的tostring
當直接輸出乙個物件時,tostring方法會被預設呼叫。
當物件被**時,系統自動呼叫該物件的finalize方法,子類也可以重寫該方法。
**時機:當某個物件沒有任何引用時,系統會決定什麼時候(有一套自己的演算法)使用垃圾**機制來銷毀物件,程式設計師也可以通過system.gc()主動呼叫
public class finalize }斷點除錯用於檢視原始碼執行過程,從而發現錯誤所在。class car
@override
protected void finalize() throws throwable
}
在斷點除錯中,是以物件的執行型別來執行的。
可以在除錯的過程中動態加入斷電,快捷鍵f9可以直接跳入下乙個斷點。
進入方法可以進入jdk原始碼中的方法。
封裝,繼承,多型
一 1 封裝 該隱藏隱藏,該公開的公開 屬性隱藏,同時提供get set方法 有些方法應該隱藏 方法宣告公開,實現隱藏。實現的改變對架構的影響最小 2 繼承 一般 特殊 單繼承 乙個類最多只能有乙個直接父類。類之間可以形成樹狀關係 根據訪問許可權,子類如果可以訪問父類的屬性和方法,就能繼承 priv...
繼承 封裝 多型
一 封裝 封裝是實現物件導向程式設計的第一步,封裝就是將資料或函式等集合在乙個個的單元中 我們稱之為類 被封裝的物件通常被稱為抽象資料型別。封裝的意義 封裝的意義在於保護或者防止 資料 被我們無意中破壞。在物件導向程式設計中資料被看作是乙個中心的元素並且和使用它的函式結合的很密切,從而保護它不被其它...
封裝 繼承 多型
一 封裝 封裝是實現物件導向程式設計的第一步,封裝就是將資料或函式等集合在乙個個的單元中 我們稱之為類 被封裝的物件通常被稱為抽象資料型別。封裝的意義 封裝的意義在於保護或者防止 資料 被我們無意中破壞。在物件導向程式設計中資料被看作是乙個中心的元素並且和使用它的函式結合的很密切,從而保護它不被其它...