面向?qū)ο蟮娜齻€(gè)基本特征是:封裝、繼承、多態(tài)。

(1)封裝(Encapsulation)-隱藏實(shí)現(xiàn)

封裝最好理解了。封裝是面向?qū)ο蟮奶卣髦唬菍ο蠛皖惛拍畹闹饕匦浴?/p>
封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進(jìn)行信息隱藏。
簡單的說,一個(gè)類就是一個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。在一個(gè)對象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問。通過這種方式,對象對內(nèi)部數(shù)據(jù)提供了不同級別的保護(hù),以防止程序中無關(guān)的部分意外的改變或錯(cuò)誤的使用了對象的私有部分。
在Java中類中成員的屬性有:public, protected, <default>, private,這四個(gè)屬性的訪問權(quán)限依次降低。
(2)繼承(Inheritance)-接口的重用

面向?qū)ο缶幊?(OOP) 語言的一個(gè)主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進(jìn)行擴(kuò)展。
通過繼承創(chuàng)建的新類稱為“子類”或“派生類”。
被繼承的類稱為“基類”、“父類”或“超類”。
繼承的過程,就是從一般到特殊的過程。
要實(shí)現(xiàn)繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實(shí)現(xiàn)。
在某些 OOP 語言中,一個(gè)子類可以繼承多個(gè)基類。但是一般情況下,一個(gè)子類只能有一個(gè)基類,要實(shí)現(xiàn)多重繼承,可以通過多級繼承來實(shí)現(xiàn)。
?繼承概念的實(shí)現(xiàn)方式有三類:實(shí)現(xiàn)繼承、接口繼承和可視繼承。
???????實(shí)現(xiàn)繼承是指使用基類的屬性和方法而無需額外編碼的能力;
????????接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力;
???????可視繼承是指子窗體(類)使用基窗體(類)的外觀和實(shí)現(xiàn)代碼的能力。
在考慮使用繼承時(shí),有一點(diǎn)需要注意,那就是兩個(gè)類之間的關(guān)系應(yīng)該是“屬于”關(guān)系。例如,Employee 是一個(gè)人,Manager 也是一個(gè)人,因此這兩個(gè)類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因?yàn)橥炔⒉皇且粋€(gè)人。
抽象類僅定義將由子類創(chuàng)建的一般屬性和方法,創(chuàng)建抽象類時(shí),請使用關(guān)鍵字 Interface 而不是 Class。
OO開發(fā)范式大致為:劃分對象→抽象類→將類組織成為層次化結(jié)構(gòu)(繼承和合成) →用類與實(shí)例進(jìn)行設(shè)計(jì)和實(shí)現(xiàn)幾個(gè)階段。
(3)多態(tài)(Polymorphism)-對象的互換的魔法
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。
態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作,如圖所示:

多態(tài)的優(yōu)點(diǎn)
1. 消除類型之間的耦合關(guān)系
2. 可替換性
3. 可擴(kuò)充性
4. 接口性
5. 靈活性
6. 簡化性
多態(tài)存在的三個(gè)必要條件
繼承
重寫
父類引用指向子類對象
當(dāng)使用多態(tài)方式調(diào)用方法時(shí),首先檢查父類中是否有該方法,如果沒有,則編譯錯(cuò)誤;如果有,再去調(diào)用子類的同名方法。
多態(tài)的好處:可以使程序有良好的擴(kuò)展,并可以對所有類的對象進(jìn)行通用處理。
以下是一個(gè)多態(tài)實(shí)例的演示,詳細(xì)說明請看注釋
public class Test {
? ? public static void main(String[] args) {
? ? ? show(new Cat());? // 以 Cat 對象調(diào)用 show 方法
? ? ? show(new Dog());? // 以 Dog 對象調(diào)用 show 方法
? ? ? Animal a = new Cat();? // 向上轉(zhuǎn)型?
? ? ? a.eat();? ? ? ? ? ? ? // 調(diào)用的是 Cat 的 eat
? ? ? Cat c = (Cat)a;? ? ? ? // 向下轉(zhuǎn)型?
? ? ? c.work();? ? ? ? // 調(diào)用的是 Cat 的 work
? }?
? ? public static void show(Animal a)? {
? ? ? a.eat();?
? ? ? ? // 類型判斷
? ? ? ? if (a instanceof Cat)? {? // 貓做的事情
? ? ? ? ? ? Cat c = (Cat)a;?
? ? ? ? ? ? c.work();?
? ? ? ? } else if (a instanceof Dog) { // 狗做的事情
? ? ? ? ? ? Dog c = (Dog)a;?
? ? ? ? ? ? c.work();?
? ? ? ? }?
? ? }?
}
abstract class Animal {?
? ? abstract void eat();?
}?
class Cat extends Animal {?
? ? public void eat() {?
? ? ? ? System.out.println("吃魚");?
? ? }?
? ? public void work() {?
? ? ? ? System.out.println("抓老鼠");?
? ? }?
}?
class Dog extends Animal {?
? ? public void eat() {?
? ? ? ? System.out.println("吃骨頭");?
? ? }?
? ? public void work() {?
? ? ? ? System.out.println("看家");?
? ? }?
}
執(zhí)行以上程序,輸出結(jié)果為:
吃魚
抓老鼠
吃骨頭
看家
吃魚
抓老鼠
多態(tài)的實(shí)現(xiàn)方式
方式一:重寫:
這個(gè)內(nèi)容已經(jīng)在上一章節(jié)詳細(xì)講過,就不再闡述,詳細(xì)可訪問:Java 重寫(Override)與重載(Overload)。
方式二:接口
1. 生活中的接口最具代表性的就是插座,例如一個(gè)三接頭的插頭都能接在三孔插座中,因?yàn)檫@個(gè)是每個(gè)國家都有各自規(guī)定的接口規(guī)則,有可能到國外就不行,那是因?yàn)閲庾约憾x的接口類型。
2. java中的接口類似于生活中的接口,就是一些方法特征的集合,但沒有方法的實(shí)現(xiàn)。具體可以看?java接口?這一章節(jié)的內(nèi)容。
方式三:抽象類和抽象方法
詳情請看?Java抽象類?章節(jié)。