一、對象的3種關係java
包含spa
關聯對象
繼承繼承
二、Java中的繼承接口
三、重寫it
一、現實世界中對象之間主要存在3種關係:包含、關聯和繼承。io
包含:當對象A是對象B的一個組成部分時,稱對象B包含對象A。稱爲「has-a」。被包含對象將被保存在包含它的對象的內部,例如發動機對象被保存在汽車對象的內部,做爲汽車對象的一個組成部分。利用一個已有對象構造另外一個對象,在面向對象程序語言中稱爲合成(composition),是代碼重用的一種重要方式。編譯
關聯:當對象A中須要保存對象B的一個引用而不是對象B自己時,稱對象A和對象B之間是關聯關係。此時表示對象B表達對象A的某種屬性,但不是對象A的一個組成部分。基礎
繼承:當對象A是對象B的特例時,稱對象A繼承了對象B。例如山地車和自行車(」is-a」)。繼承也是面向對象的多態性的基礎。變量
二、Java中的繼承
單繼承
繼承能夠分爲單繼承和多繼承。在單繼承方式下,類的層次結構爲樹型結構,而多重繼承是網狀結構。Java只支持類之間的單繼承,多重繼承要經過接口實現。單繼承的優勢是能夠避免多個直接父類之間可能產生的衝突,使代碼更可靠。經過接口實現多繼承。
繼承優勢:提升代碼複用性,實現對現實世界更好的抽象
單繼承而非多繼承:單繼承避免多個父類之間可能的衝突,多繼承會引發混亂,繼承鏈複雜,維護難
子類對象能夠做爲父類對象使用。子類與父類的差別主要體如今兩個方面:子類每每對父類進行了擴充,增長了新的變量和方法,因此在Java中繼承用關鍵字 extends 。另外,更重要的一方面是子類能夠改變父類繼承而來的方法,稱爲方法的重寫(overriding)。重寫意味着子類使用與父類相同的接口,但實現不一樣的行爲。
下列是子類不能繼承的:
(1) 帶private修飾符的屬性、方法是不能被繼承的
(2) 構造方法不能被繼承
三、重寫
重載:方法名相同可是參數不一樣
重寫和重載沒有關係!!!
子類方法重寫時,能夠在方法裏經過super調用父類
(1)子類中父類成員的隱藏
在類層次結構中,當子類的成員變量與父類的成員變量同名時,子類的成員變量會隱藏父類的成員變量;當子類的方法與父類具備相同的名字、參數列表、返回值類型時,子類的方法重寫了父類的方法,在父類定義的方法就被隱藏。「隱藏」的含義是,經過子類對象調用子類中與父類同名的變量和方法時,操做的是這些變量和方法在子類中的定義。子類經過成員變量的隱藏和方法的重寫能夠把父類的狀態和行爲改變爲自身的狀態和行爲。
(2)方法重寫
指子類重寫父類的成員方法。
方法重寫遵照的規則:
① 子類中重寫方法的返回值類型必須與父類中被重寫方法的返回值類型相同。
② 子類中重寫方法的訪問權限不能縮小
③ 子類中重寫方法不能拋出新的異常。
(《瘋狂java講義》)重寫要遵循「兩同兩小一大」規則:「兩同」即方法名、形參列表相同,「兩小」即子類方法返回值類型應比父類返回值類型更小或相同、子類方法聲明拋出的異常應比父類方法聲明拋出的異常類更小或相等,「一大」指子類方法的訪問權限應比父類方法更大或相同。覆蓋方法或被覆蓋方法要麼都是類方法,要麼都是實例方法,不能一個是類方法,一個是實例方法。
返回值類型小於等於父類:僅當父類方法返回是類類型時,子類重寫可返回子類類型,父類返回person,子類返回Student(子類擴展了父類,子類也是一個父類),當是基本類型返回時,必須一致(不然編譯報錯incompatible with不相符)。