面向?qū)ο蟮娜齻€(gè)特征

面向?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é)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容