java面向對象三大特性:封裝、繼承、多態
一、封裝
封裝也稱信息隱藏,是指利用抽象數據類型把數據和基於數據的操作封裝起來,使其成為一個不可分割的整體,數據隱藏在抽象數據內部,盡可能的隱藏數據細節,只保留一些接口使其與外界發生聯系。也就是說用戶無需知道內部的數據和方法的具體實現細節,只需根據留在外部的接口進行操作就行。
封裝的好處:
1) 實現了專業的分工
2) 良好的封裝能夠減少耦合
3) 類內部的結構能夠自由修改
4) 可以對成員進行更精確的控制
5) 隱藏信息,實現細節
二、繼承
Java繼承是面向對象的最顯著的一個特征。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性和行為,並能擴展新的能力。JAVA不支持多繼承,單繼承使JAVA的繼承關系很簡單,一個類只能有一個父類,易於管理程序,父類是子類的一般化,子類是父類的特殊化(具體化)
繼承的聲明方式:
1)、使用extends 關鍵字聲明,
2)、子類 extends 父類{}
繼承的特征:
1)、傳遞性
若類C繼承類B,類B繼承類A(多繼承),則類C既有從類B那裏繼承下來的屬性與方法,也有從類A那裏繼承下來的屬性與方法,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的,但仍是類C的屬性和方法
2)、單根性
若類B繼承類A,那麽建立類B時只需要再描述與基類(類A)不同的少量特征(數據成員和成員方法)即可。這種做法能減小代碼和數據的冗余度,大大增加程序的重用性。
3)、子類調用父類成員
使用super關鍵字調用父類成員
子類默認會先調用父類的無參構造方法,如果父沒有則報錯,可以手動指定,但必須在第一行
設計繼承關系的驗證方法:
如果想要知道某物是否應該要繼承另一物是,則可以使用IS-A測試來檢驗。例如:狗是動物,三角形是一個多邊形等。
註意:
1)、繼承下來的方法可以被覆蓋掉,但是實例變量不能被覆蓋掉。
2)、當某個方法在子類中被覆蓋過,調用這個方法時會調用到覆蓋過的版本。
三、多態
在了解多態之前,首先需要知道方法的唯一性標識即什麽是相同/不同的方法:
- 一個方法可以由:修飾符如public、static+返回值+方法名+參數+throw的異常 5部分構成
- 其中只有方法名和參數是唯一性標識,意即只要方法名和參數相同那他們就是相同的方法
- 所謂參數相同,是指參數的個數,類型,順序一致,其中任何一項不同都是不同的方法
何謂重載:
- 重載是指一個類裏面(包括父類的方法)存在方法名相同,但是參數不一樣的方法,參數不一樣可以是不同的參數個數、類型或順序
- 如果僅僅是修飾符、返回值、throw的異常 不同,那這是2個相同的方法,編譯都通不過,更不要說重載了
何謂覆蓋/重寫:
- 覆蓋描述存在繼承關系時子類的一種行為
- 子類中存在和父類相同的方法即為覆蓋,何謂相同方法請牢記前面的描述,方法名和參數相同,包括參數個數、類型、順序
覆蓋/重寫的規則:
- 子類不能覆蓋父類private的方法,private對子類不可見,如果子類定義了一個和父類private方法相同的方法,實為新增方法
- 重寫方法的修飾符一定要大於被重寫方法的修飾符(public > protected > default > private)
- 重寫拋出的異常需與父類相同或是父類異常的子類,或者重寫方法幹脆不寫throws
- 重寫方法的返回值必須與被重寫方法一致,否則編譯報錯
- 靜態方法不能被重寫為非靜態方法,否則編譯出錯
理解了上述知識點,是時候定義多態了:
- 多態可以說是“一個接口,多種實現”或者說是父類的引用變量可以指向子類的實例,被引用對象的類型決定調用誰的方法,但這個方法必須在父類中定義
- 多態可以分為兩種類型:編譯時多態(方法的重載)和運行時多態(繼承時方法的重寫),編譯時多態很好理解,後述內容針對運行時多態
- 運行時多態依賴於繼承、重寫和向上轉型
向上轉型的缺憾:
- 只能調用父類中定義的屬性和方法,對於子類中的方法和屬性它就望塵莫及了,必須強轉成子類類型
總結概括:
- 當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法,但是它仍然要根據繼承鏈中方法調用的優先級來確認方法,該優先級為:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
java面向對象三大特性:封裝、繼承、多態