文/岳青玲
面向?qū)ο笫钱?dāng)前Java和C#等主流編程語(yǔ)言共同的特點(diǎn)。面向?qū)ο蟠嬖谲浖_(kāi)發(fā)過(guò)程中的每個(gè)階段。其中包含了面向?qū)ο蠓治觯∣OA)、面向?qū)ο笤O(shè)計(jì)(OOD)和面向?qū)ο缶幊蹋∣OP),上述幾個(gè)方面形成了完整的軟件工程核心理論、方法以及工具。在學(xué)習(xí)Java的過(guò)程中,首先接觸的就是相關(guān)的基本概念,經(jīng)過(guò)此模塊的系統(tǒng)學(xué)習(xí)后,我們可以正確的認(rèn)知對(duì)象并進(jìn)行使用,在面向?qū)ο蟮膶W(xué)習(xí)過(guò)程中有很大的推進(jìn)作用。本文對(duì)Java的三大特性:封裝、繼承、多態(tài)進(jìn)行詳細(xì)的解釋和舉例,對(duì)理解學(xué)習(xí)面向?qū)ο笏枷牒秃罄m(xù)的學(xué)習(xí)有較大的幫助。
面向?qū)ο笤O(shè)計(jì)方法的第一大特性--封裝,該特性是指把抽象的函數(shù)接口的具體實(shí)現(xiàn)細(xì)節(jié)當(dāng)作一個(gè)包,將其包裝并且隱藏起來(lái)。
(1)定義:將對(duì)象的屬性和具體細(xì)節(jié)打包隱藏,對(duì)外使用時(shí)只能看到相應(yīng)的接口,來(lái)執(zhí)行對(duì)屬性的可讀及修改的訪問(wèn)權(quán)限。
(2)目的:增加程序的安全級(jí)別,降低后續(xù)的編程復(fù)雜度,程序的使用者不需要了解實(shí)現(xiàn)的細(xì)節(jié),只需要了解它的外部接口,來(lái)進(jìn)行對(duì)該類(lèi)的使用。
(3)基本要求:將屬性進(jìn)行私有化操作,對(duì)每個(gè)屬性創(chuàng)建set和get方法,如果這里存在一個(gè)帶參數(shù)的構(gòu)造函數(shù),以此同時(shí)就必須存在一個(gè)不帶參數(shù)的構(gòu)造函數(shù)。在后續(xù)的開(kāi)發(fā)階段需要對(duì)已經(jīng)存在的類(lèi)測(cè)試,因此有時(shí)還需要寫(xiě)toString方法,雖然不是強(qiáng)制的。
(1)優(yōu)秀的封裝使用可以低耦合。
(2)類(lèi)的內(nèi)部結(jié)構(gòu)可以根據(jù)實(shí)際需求進(jìn)行更改。
(3)對(duì)成員變量的調(diào)控變得更精準(zhǔn)。
(4)隱藏不需要外部了解的細(xì)節(jié)。
修改屬性的可見(jiàn)性來(lái)限制對(duì)屬性的訪問(wèn)(一般限制為private),例如:
public class Someone {
private String name;
private String gender;}
上述例子,把 name 和 gender屬性設(shè)定為private,只有該類(lèi)才可以執(zhí)行此方法,因此可以認(rèn)定把細(xì)節(jié)模糊處理。

表1:類(lèi)成員修飾符與訪問(wèn)能力之間的關(guān)系(類(lèi)成員訪問(wèn)權(quán)限)

表2:繼承和權(quán)限
其次,再將上述方法中的值都封裝起來(lái),并設(shè)置為一個(gè)方法,外部如果想使用該值時(shí),可以用過(guò)調(diào)用該方法來(lái)使用其中的值,這樣做可以對(duì)一些私有屬性進(jìn)行訪問(wèn)。
實(shí)現(xiàn)代碼的復(fù)用。
兩個(gè)類(lèi)存在同樣的屬性和同樣的方法名稱(chēng)時(shí),可以把兩個(gè)類(lèi)中共同的部分提取出來(lái),新建類(lèi)為父類(lèi),之前的兩個(gè)類(lèi)來(lái)繼承這個(gè)類(lèi)進(jìn)而使用方法。進(jìn)行繼承操作后,子類(lèi)自動(dòng)擁有了父類(lèi)的屬性和詳細(xì)方法,但是父類(lèi)存在private的屬性和方法,子類(lèi)不能夠繼承。除此之外,子類(lèi)可以再次編寫(xiě)自己特有的屬性和方法,目的就為了后續(xù)開(kāi)發(fā)過(guò)程中功能的擴(kuò)展,子類(lèi)也可以復(fù)寫(xiě)方法。如表1、表2所示。
繼承是面向?qū)ο笞铒@著的一個(gè)特性。繼承是從已有的類(lèi)中派生出新的類(lèi),新的類(lèi)能吸收已有類(lèi)的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。
在Java之中,實(shí)現(xiàn)繼承,可以參考以下例子:
class 子類(lèi) extends 父類(lèi) {}
子類(lèi)可以叫繼承類(lèi)(派生類(lèi)); 父類(lèi)可以叫超類(lèi)(Super Class)。
觀察繼承的基本實(shí)現(xiàn):


運(yùn)行結(jié)果:類(lèi)別:哺乳動(dòng)物,數(shù)量:6
通過(guò)代碼可以發(fā)現(xiàn),子類(lèi)(Student)并沒(méi)有定義任何的操作,而在主類(lèi)中所使用的全部操作都是由Person類(lèi)定義的,這證明:子類(lèi)即使不擴(kuò)充父類(lèi),也能維持父類(lèi)的操作。
同樣的事物處理,使用的方法為同一個(gè)方法,方法中的參數(shù)也相同,但是最后表現(xiàn)的結(jié)果不同。
繼承:在多態(tài)的管理網(wǎng)中必須要有存在繼承關(guān)系的子類(lèi)和父類(lèi)。
重寫(xiě):子類(lèi)會(huì)針對(duì)父類(lèi)中的一些特點(diǎn)方法進(jìn)行自定義,后續(xù)在使用這些方法時(shí)會(huì)調(diào)用子類(lèi)中重寫(xiě)的方法。
向上轉(zhuǎn)型:在多態(tài)當(dāng)中需要把子類(lèi)引用的對(duì)象賦值給到父類(lèi),只有這樣做才能達(dá)到可以調(diào)用父類(lèi)、子類(lèi)方法的目的。
滿(mǎn)足了以上的幾個(gè)條件,我們可以在同一個(gè)繼承的結(jié)構(gòu)中使用統(tǒng)一邏輯代碼,進(jìn)而去處理不同類(lèi)別的對(duì)象,進(jìn)而達(dá)到執(zhí)行不同方法的目的。
3.3.1 基于繼承實(shí)現(xiàn)的多態(tài)
基于繼承來(lái)實(shí)現(xiàn)多態(tài),該方法主要表現(xiàn)在父類(lèi)和繼承該父類(lèi)的不同子類(lèi)對(duì)這些方法進(jìn)行重寫(xiě),多個(gè)子類(lèi)進(jìn)行重寫(xiě),后續(xù)調(diào)用時(shí)可以執(zhí)行不同的行為。
3.3.2 基于接口實(shí)現(xiàn)的多態(tài)
繼承是通過(guò)重新編寫(xiě)父類(lèi)的同一個(gè)方法中的不同的子類(lèi)來(lái)實(shí)現(xiàn)的,如果這樣做的話就是覆蓋接口來(lái)實(shí)現(xiàn)多態(tài)。
(1)提高了安全性,防止一些誤操作。
(2)提高了復(fù)用性,封裝之后便于調(diào)用。
(3)信息隱藏,隱藏了實(shí)現(xiàn)細(xì)節(jié)。
(1)繼承可提高代碼的復(fù)用性。
(2)繼承可提高代碼的穩(wěn)定性。
(3)繼承讓類(lèi)與類(lèi)之間產(chǎn)生關(guān)系,是多態(tài)的前提。
(1)提高了代碼的維護(hù)性(繼承保證)。
(2)提高了代碼的擴(kuò)展性(由多態(tài)保證)。
封裝->繼承->多態(tài)這不單單是三個(gè)名詞的簡(jiǎn)單羅列,更是一步步遞進(jìn)的關(guān)系。對(duì)于面向?qū)ο蟮某绦蛟O(shè)計(jì),封裝是基礎(chǔ),繼承是多態(tài)的前提條件,三者邏輯順序不可顛倒。
通過(guò)上述可以理解面向?qū)ο蟮闹行乃枷刖褪钦_的理解對(duì)象的概念,還有對(duì)象到類(lèi)、類(lèi)到接口等過(guò)程。面向?qū)ο箝_(kāi)發(fā)思想的三大特性包括封裝、繼承與多態(tài),Java的三大特性在初次學(xué)習(xí)和后續(xù)開(kāi)發(fā)階段,這些特性都是與開(kāi)發(fā)息息相關(guān)的,在分析設(shè)計(jì)類(lèi)的過(guò)程中讓代碼之間變得低耦合、高內(nèi)聚,進(jìn)而提升代碼的復(fù)用性。
Java程序在執(zhí)行過(guò)程中,正確的認(rèn)知對(duì)象的整個(gè)聲明周期和后續(xù)在實(shí)際的開(kāi)發(fā)過(guò)程中正確的使用它們,是在編寫(xiě)的效率方面有極大幫助的。因此從理解對(duì)象的概念、學(xué)習(xí)對(duì)象的使用為起點(diǎn),后續(xù)進(jìn)行面向?qū)ο蟮姆治觥㈤_(kāi)發(fā)過(guò)程,在實(shí)踐過(guò)程中才能更迅速的提高對(duì)整個(gè)系統(tǒng)的分析、設(shè)計(jì)能力。