文/岳青玲
面向?qū)ο笫钱?dāng)前Java和C#等主流編程語言共同的特點(diǎn)。面向?qū)ο蟠嬖谲浖_發(fā)過程中的每個階段。其中包含了面向?qū)ο蠓治觯∣OA)、面向?qū)ο笤O(shè)計(OOD)和面向?qū)ο缶幊蹋∣OP),上述幾個方面形成了完整的軟件工程核心理論、方法以及工具。在學(xué)習(xí)Java的過程中,首先接觸的就是相關(guān)的基本概念,經(jīng)過此模塊的系統(tǒng)學(xué)習(xí)后,我們可以正確的認(rèn)知對象并進(jìn)行使用,在面向?qū)ο蟮膶W(xué)習(xí)過程中有很大的推進(jìn)作用。本文對Java的三大特性:封裝、繼承、多態(tài)進(jìn)行詳細(xì)的解釋和舉例,對理解學(xué)習(xí)面向?qū)ο笏枷牒秃罄m(xù)的學(xué)習(xí)有較大的幫助。
面向?qū)ο笤O(shè)計方法的第一大特性--封裝,該特性是指把抽象的函數(shù)接口的具體實(shí)現(xiàn)細(xì)節(jié)當(dāng)作一個包,將其包裝并且隱藏起來。
(1)定義:將對象的屬性和具體細(xì)節(jié)打包隱藏,對外使用時只能看到相應(yīng)的接口,來執(zhí)行對屬性的可讀及修改的訪問權(quán)限。
(2)目的:增加程序的安全級別,降低后續(xù)的編程復(fù)雜度,程序的使用者不需要了解實(shí)現(xiàn)的細(xì)節(jié),只需要了解它的外部接口,來進(jìn)行對該類的使用。
(3)基本要求:將屬性進(jìn)行私有化操作,對每個屬性創(chuàng)建set和get方法,如果這里存在一個帶參數(shù)的構(gòu)造函數(shù),以此同時就必須存在一個不帶參數(shù)的構(gòu)造函數(shù)。在后續(xù)的開發(fā)階段需要對已經(jīng)存在的類測試,因此有時還需要寫toString方法,雖然不是強(qiáng)制的。
(1)優(yōu)秀的封裝使用可以低耦合。
(2)類的內(nèi)部結(jié)構(gòu)可以根據(jù)實(shí)際需求進(jìn)行更改。
(3)對成員變量的調(diào)控變得更精準(zhǔn)。
(4)隱藏不需要外部了解的細(xì)節(jié)。
修改屬性的可見性來限制對屬性的訪問(一般限制為private),例如:
public class Someone {
private String name;
private String gender;}
上述例子,把 name 和 gender屬性設(shè)定為private,只有該類才可以執(zhí)行此方法,因此可以認(rèn)定把細(xì)節(jié)模糊處理。
表1:類成員修飾符與訪問能力之間的關(guān)系(類成員訪問權(quán)限)
表2:繼承和權(quán)限
其次,再將上述方法中的值都封裝起來,并設(shè)置為一個方法,外部如果想使用該值時,可以用過調(diào)用該方法來使用其中的值,這樣做可以對一些私有屬性進(jìn)行訪問。
實(shí)現(xiàn)代碼的復(fù)用。
兩個類存在同樣的屬性和同樣的方法名稱時,可以把兩個類中共同的部分提取出來,新建類為父類,之前的兩個類來繼承這個類進(jìn)而使用方法。進(jìn)行繼承操作后,子類自動擁有了父類的屬性和詳細(xì)方法,但是父類存在private的屬性和方法,子類不能夠繼承。除此之外,子類可以再次編寫自己特有的屬性和方法,目的就為了后續(xù)開發(fā)過程中功能的擴(kuò)展,子類也可以復(fù)寫方法。如表1、表2所示。
繼承是面向?qū)ο笞铒@著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。
在Java之中,實(shí)現(xiàn)繼承,可以參考以下例子:
class 子類 extends 父類 {}
子類可以叫繼承類(派生類); 父類可以叫超類(Super Class)。
觀察繼承的基本實(shí)現(xiàn):
運(yùn)行結(jié)果:類別:哺乳動物,數(shù)量:6
通過代碼可以發(fā)現(xiàn),子類(Student)并沒有定義任何的操作,而在主類中所使用的全部操作都是由Person類定義的,這證明:子類即使不擴(kuò)充父類,也能維持父類的操作。
同樣的事物處理,使用的方法為同一個方法,方法中的參數(shù)也相同,但是最后表現(xiàn)的結(jié)果不同。
繼承:在多態(tài)的管理網(wǎng)中必須要有存在繼承關(guān)系的子類和父類。
重寫:子類會針對父類中的一些特點(diǎn)方法進(jìn)行自定義,后續(xù)在使用這些方法時會調(diào)用子類中重寫的方法。
向上轉(zhuǎn)型:在多態(tài)當(dāng)中需要把子類引用的對象賦值給到父類,只有這樣做才能達(dá)到可以調(diào)用父類、子類方法的目的。
滿足了以上的幾個條件,我們可以在同一個繼承的結(jié)構(gòu)中使用統(tǒng)一邏輯代碼,進(jìn)而去處理不同類別的對象,進(jìn)而達(dá)到執(zhí)行不同方法的目的。
3.3.1 基于繼承實(shí)現(xiàn)的多態(tài)
基于繼承來實(shí)現(xiàn)多態(tài),該方法主要表現(xiàn)在父類和繼承該父類的不同子類對這些方法進(jìn)行重寫,多個子類進(jìn)行重寫,后續(xù)調(diào)用時可以執(zhí)行不同的行為。
3.3.2 基于接口實(shí)現(xiàn)的多態(tài)
繼承是通過重新編寫父類的同一個方法中的不同的子類來實(shí)現(xiàn)的,如果這樣做的話就是覆蓋接口來實(shí)現(xiàn)多態(tài)。
(1)提高了安全性,防止一些誤操作。
(2)提高了復(fù)用性,封裝之后便于調(diào)用。
(3)信息隱藏,隱藏了實(shí)現(xiàn)細(xì)節(jié)。
(1)繼承可提高代碼的復(fù)用性。
(2)繼承可提高代碼的穩(wěn)定性。
(3)繼承讓類與類之間產(chǎn)生關(guān)系,是多態(tài)的前提。
(1)提高了代碼的維護(hù)性(繼承保證)。
(2)提高了代碼的擴(kuò)展性(由多態(tài)保證)。
封裝->繼承->多態(tài)這不單單是三個名詞的簡單羅列,更是一步步遞進(jìn)的關(guān)系。對于面向?qū)ο蟮某绦蛟O(shè)計,封裝是基礎(chǔ),繼承是多態(tài)的前提條件,三者邏輯順序不可顛倒。
通過上述可以理解面向?qū)ο蟮闹行乃枷刖褪钦_的理解對象的概念,還有對象到類、類到接口等過程。面向?qū)ο箝_發(fā)思想的三大特性包括封裝、繼承與多態(tài),Java的三大特性在初次學(xué)習(xí)和后續(xù)開發(fā)階段,這些特性都是與開發(fā)息息相關(guān)的,在分析設(shè)計類的過程中讓代碼之間變得低耦合、高內(nèi)聚,進(jìn)而提升代碼的復(fù)用性。
Java程序在執(zhí)行過程中,正確的認(rèn)知對象的整個聲明周期和后續(xù)在實(shí)際的開發(fā)過程中正確的使用它們,是在編寫的效率方面有極大幫助的。因此從理解對象的概念、學(xué)習(xí)對象的使用為起點(diǎn),后續(xù)進(jìn)行面向?qū)ο蟮姆治?、開發(fā)過程,在實(shí)踐過程中才能更迅速的提高對整個系統(tǒng)的分析、設(shè)計能力。