2017年計算機二級考試java章節(jié)輔導(dǎo):面向?qū)ο蟪绦蛟O(shè)計學習教程

字號:


    第6章對象、類、包和接口
    在前面幾章中,我們對Java的簡單數(shù)據(jù)類型、數(shù)組、運算符和表達式以及流控制方法作了詳細的介紹。從現(xiàn)在開始,我們要深入到面向?qū)ο蟮木幊碳夹g(shù),深入到Java最吸引人的地方。本章中,我們首先講述面向?qū)ο蟪绦蛟O(shè)計的基本概念及特點,然后討論Java中的類、對象、包和接口,最后進行小結(jié),給出一個完整的Java文件的格式。
    6.1面向?qū)ο蟮某绦蛟O(shè)計
    面向過程的程序設(shè)計方法從解決問題的每一個步驟入手,它適合于解決比較小的簡單問題。C語言采用面向過程的程序設(shè)計模型,但是由于C本身幾乎沒有支持代碼重用的語言結(jié)構(gòu),并且缺乏統(tǒng)一的接口,使得當程序的規(guī)模達到一定程度時,程序員很難控制其復(fù)雜性。
    面向?qū)ο蟮某绦蛟O(shè)計方法則按照現(xiàn)實世界的特點來管理復(fù)雜的事物,把它們抽象為對象,具有自己的狀態(tài)和行為,通過對消息的反應(yīng)來完成一定的任務(wù)。
    6.1.1對象、類和消息
    一個對象就是變量和相關(guān)的方法的集合,其中變量表明對象的狀態(tài),方法表明對象所具有的行為,下圖表示了一個對象的特征:
    一個對象的變量構(gòu)成這個對象的核心,包圍在它外面的方法使這個對象和其它對象分離開來。例如:我們可以把汽車抽象為一個對象,用變量來表示它當前的狀態(tài),如速度、油量、型號、所處的位置等,它的行為則可以有加速、剎車、換擋等。我們操縱汽車時,不用去考慮汽車內(nèi)部各個零件如何運作的細節(jié),而只需根據(jù)汽車可能的行為使用相應(yīng)的方法即可。實際上,面向?qū)ο蟮某绦蛟O(shè)計實現(xiàn)了對對象的封裝,使我們不必關(guān)心對象的行為是如何實現(xiàn)的這樣一些細節(jié)。通過對對象的封裝,實現(xiàn)了模塊化和信息隱藏,有利于程序的可移植性和安全性,同時也利于對復(fù)雜對象的管理。
    對象之間必須要進行交互來實現(xiàn)復(fù)雜的行為。例如,要使汽車加速,必須發(fā)給它一個消息,告訴它進行何種動作(這里是加速)以及實現(xiàn)這種動作所需的參數(shù)(這里是需要達到的速度等)。對象A對象B間的消息傳遞過程。
    一個消息包含三個方面的內(nèi)容:
    ●消息的接收者
    ●接收對象應(yīng)采用的方法
    ●方法所需要的參數(shù)。
    同時,接收消息的對象在執(zhí)行相應(yīng)的方法后,可能會給發(fā)送消息的對象返回一些信息(如上例中,汽車的儀表上會出現(xiàn)已經(jīng)達到的速度等)。
    由于任何一個對象的所有行為都可以用方法來描述,通過消息機制就可以完全實現(xiàn)對象之間的交互,同時,處于不同處理過程甚至不同主機的對象間也可以通過消息實現(xiàn)交互。
    上面所說的對象是一個具體的事物,例如每輛汽車都是一個不同的對象。但是多個對象常常具有一些共性,如所有的汽車都有輪子、方向盤、剎車裝置等。于是我們抽象出一類對象的共性,這就是類。類中定義一類對象共有的變量和方法。把一個類實例化即生成該類的一個對象。比如我可以定義一個汽車類來描述所有汽車的共性。通過類的定義人們可以實現(xiàn)代碼的復(fù)用。我們不用去描述每一個對象(如某輛汽車),而是通過創(chuàng)建類(如汽車類)的一個實例來創(chuàng)建該類的一個對象,這大大減化了軟件的設(shè)計。
    6.1.2繼承
    通過對象、類,我們實現(xiàn)了封裝,通過子類我們可以實現(xiàn)繼承。
    對于上例來說,公共汽車、出租車、貨車等都是汽車,但它們是不同的汽車,除了具有汽車的共性外,它們還具有自己的特點(如不同的操作方法,不同的用途等)。這時我們可以把它們作為汽車的子類來實現(xiàn),它們繼承父類(汽車)的所有狀態(tài)和行為,同時增加自己的狀態(tài)和行為。通過父類和子類,我們實現(xiàn)了類的層次,可以從最一般的類開始,逐步特殊化,定義一系列的子類。同時,通過繼承也實現(xiàn)了代碼的復(fù)用,使程序的復(fù)雜性線性地增長,而不是呈幾何級數(shù)增長。
    在C++中支持多重繼承,即一個類可以繼承多個父類,這使得對象的實現(xiàn)變得非常復(fù)雜且不可預(yù)料(設(shè)想多個父類擁有某些相同的變量和方法)。Java則只支持單一繼承,大大降低了復(fù)雜度。在Java中通過接口可以實現(xiàn)多重繼承,但接口的概念更簡單,使用更方便,而且不僅僅限于繼承,它使多個不相關(guān)的類可以具有相同的方法。
    6.1.3多態(tài)
    Java通過方法重寫和方法重載(overloading)來實現(xiàn)多態(tài)。
    通過方法重寫,一個類中可以有多個具有相同名字的方法,由傳遞給它們不同個數(shù)或不同類型的參數(shù)來決定使用哪種方法,這就是多態(tài)。
    例如,對于一個作圖的類,它有一個draw()方法用來畫圖或輸出文字,我們可以傳遞給它一個字符串、一個矩形、一個圓形,甚至還可以再指定作圖的初始位置、圖形的顏色等,對于每一種實現(xiàn),只需實現(xiàn)一個新的draw()方法即可,而不需要新起一個名字,這樣大大簡化了方法的實現(xiàn)和調(diào)用,程序員和用戶都不需要記住很多的方法名,只需要傳入相應(yīng)的參數(shù)即可。
    通過方法重載,子類可以重新實現(xiàn)父類的某些方法,使其具有自己的特征。例如對于汽車類的加速方法,其子類(如賽車)中可能增加了一些新的部件來改善提高加速性能,這時可以在賽車類中重載父類的加速方法。重載隱藏了父類的方法,使子類擁有自己具體實現(xiàn),更進一步表明了與父類相比,子類所具有的特殊性。
    本節(jié)中,我們對面向?qū)ο蟪绦蛟O(shè)計的一些基本內(nèi)容作了講解,下面我們就分別講述Java是如何實現(xiàn)這些內(nèi)容的。