官术网_书友最值得收藏!

1.2 面向對象程序設計

Java語言是一種面向對象(OO,Object Oriented)的程序設計語言。無論是Java應用程序還是Java小程序,它們都是以類為基礎構建的。在認識Java程序前,這里先介紹一些關于面向對象程序設計的概念。

1.2.1 傳統與面向對象程序設計語言

傳統的面向過程的程序設計方法從解決問題的每一個步驟入手,較適合于解決規模較小的問題。如廣為流傳的傳統程序設計語言BASⅠC、C等采用面向過程的程序設計模型,但是由于這類語言本身幾乎沒有支持代碼重用的語言結構,并且缺乏統一的接口,使得當程序的規模達到一定程度時,程序員很難控制其復雜性。面向對象的程序設計方法則按照現實世界的特點來管理復雜的事物,把它們抽象為對象,具有自己的狀態和行為,通過對消息的反應來完成一定的任務。

面向對象程序設計(OOP)是當今計算機領域最流行的程序設計方法。這里的“對象”是什么含義呢?借用一個現實世界中“車”的例子來說明對象的含義。

在現實生活中,人們理解的“車”有各種各樣的種類,如手推車、自行車、摩托車、汽車等。從各種車可歸納出它們的共性,如車有車輪、重量、顏色等,是汽車還有車速、耗油量等。這些是從“車”這類事物抽象出來的共性,也即所謂的數據、數據成員或屬性。車不僅有這些靜態的數據,還有很多與這些數據有關的動作和行為,如車的啟動、加速、剎車和修理等,這就是所謂的代碼、成員函數或方法。將上述車的數據和動作代碼組合起來,就得到一個車類(class)。

在Java語言中定義一個關于車的類,一般的形式為:

            class  車{ // 定義一個車類
              // 車的數據成員定義
              車輪數;
              車的顏色;
              車的重量;
              車速;
            ...
            // 車的成員方法定義
              啟動();
              加速();
              剎車();
              修理();
              ...
            }

有了抽象的車類后,一輛實際的車,如一輛自行車、一輛汽車等,就是車類的一個對象(或稱實例)。對象是一個實體,而不像車是一個抽象概念。類是一類事物共性的反映,而對象是一類事物中的一個,是個性的反映。每個對象都有與其他對象不完全一樣的特性。如您和我的自行車雖然都是自行車,但二者的顏色、重量等就不可能完全一致。

通過抽象來處理復雜事物的方法可從現實世界對應到計算機程序設計中來。傳統的算法程序可以抽象成各種要處理的對象,一個對象就是數據和相關的方法的集合,其中,數據表明對象的狀態和屬性,方法表明對象所具有的行為、操作和運算功能,即類和對象將需要處理的數據和對這些數據進行的各種操作封裝起來,當需要的時候,就可以向對象發送消息,使得對象能夠調用這些方法進行相應的動作。這就是面向對象編程的基礎。與人類理解復雜事物的方式一樣,面向對象的概念構成了Java語言的核心。

1.2.2 對象的性質

面向對象程序設計技術具有封裝、繼承、多態三個主要特性。

1.封裝性

操縱汽車時,不用去考慮汽車內部各個零件如何運作的細節,而只需根據汽車可能的行為使用相應的方法即可。實際上,面向對象的程序設計實現了對象的封裝,使用戶不必關心對象的行為是如何實現這樣一些細節的。從最基本的角度看,任何程序都包含兩個部分:數據和代碼。在傳統的代碼模型中,數據在內存中進行分配并由子程序或函數代碼來處理。而面向對象設計的核心一環是將處理數據的代碼、數據的聲明和存儲封裝在一起。

可以把封裝想像為一個將代碼和數據包起來的保護膜。這個保護膜定義了對象的行為,并且保護代碼和數據不被任何其他代碼任意訪問,即一個對象中的數據和代碼相對于程序的其他部分是不可見的,它能防止那些不希望的交互和非法的訪問。

Java封裝的基本單元是類,即Java程序的基本元素是類。用戶可以創建自己的類,它是一組具有行為和結構的對象的一種抽象。對象是相關類的具體實例,是將類作為模子造出的一個翻版。因此,有時也稱對象為類的實例。

封裝的目的是為了減少復雜性,因此,類具有一套隱藏復雜性的機制。類中的每個數據和方法可以被定義為公共或私有。類的公共部分可以讓外界的用戶知道或必須知道,公共的數據和方法是類與外部的接口,程序的其他部分通過這個接口使用類的功能。而定義成私有的數據和方法則不能被類以外的其他代碼訪問。

借助于類的封裝性,便可以將數據和方法像部件一樣用于各種程序,而不必了解和記憶其內部細節。改變類的其他部分不會對整個程序產生預料之外的影響,只要保持類接口不變,它的內部工作方式可以隨意改動。

需要改變對象的數據或狀態,或需要進行對象之間的交互時,面向對象的程序設計方法提供消息機制。例如,要使汽車加速,必須發給它一個消息,告訴它進行何種動作(這里是加速)以及實現這種動作所要的參數(這里是需要達到的速度等)。這里要指明消息的接收者、接收對象應采用的方法、方法所需要的參數。同時,接收消息的對象在執行相應的方法后,可能會給發送消息的對象返回一些信息(如加速后,汽車的車速表上會出現已經達到的速度等)。

由于任何一個對象的所有行為都可以用方法來描述,通過消息機制就可以完全實現對象之間的交互,同時,處于不同處理過程甚至不同主機的對象間都可以通過消息實現交互。

2.繼承性

人們通常都會將世界看成相互關聯的可劃分層次的各種對象,如車、汽車和轎車。這里汽車是車的繼承,而轎車又是汽車的繼承。下一層次繼承了上一層次的所有特性。一個多層次的繼承關系構成了一個類樹結構。

在已經定義了車類后,再定義一個汽車類,若再一次聲明車輪數、顏色、重量等車類已定義的數據和方法,那么效率就太低了,其實只需定義汽車與一般意義下的車的不同即可。例如,增加定義一下汽車的車門數、座位數等,而繼承車類中已定義過的數據和方法。這樣可使得程序代碼得到充分復用,結構更加清晰易懂,程序的可維護性、邏輯性就更強。

在面向對象的程序設計中,繼承是指在已有類的基礎上建立一個新類。新類自動擁有父類的所有元素:數據成員和成員方法,然后再根據需要添加新任務所需的數據成員和成員方法。合理使用繼承可以減少很多的重復勞動。若類實現了一個特別的功能,那么由該類繼承的新類(派生類)就可以重復使用這些功能,而不再需要重新編程。對Java的內置類可以創建派生類,也可以對自己創建的類建立派生類。

一個不由任何類派生的類稱為基類;一個派生類的最近的上層類叫做該類的父類;從某一類派生出來的類叫做該類的子類。通過父類和子類,實現了類的層次,可以從最一般的類開始,逐步特殊化,定義一系列的子類。子類的層次并不是越多越好,因為,若層次太多,還不如重新創建一個新類。

一個類從派生它的基類到它自身可能要經過好幾個層次。類不僅能繼承其父類的所有方法和實例變量,而且還能繼承從它的基類開始到它自身之間經過的所有層次上的類的方法和實例變量。通過繼承也實現了代碼的復用,使程序的復雜性線性地增長,而不是呈幾何級數增長。

在Java中,繼承車類派生汽車類的一般形式為:

              class汽車extends車 { ... }

繼承和封裝具有很好的合作性。若一個給定類封裝了某些屬性,那么它的任何子類將繼承這些屬性并可增加它們特有的屬性。

3.多態性

不同的對象對于相同的方法表現其不同的理解和響應??梢韵胂蟮牡剑簩τ谧孕熊嚭推?,它們都能剎車,但它們的剎車方法卻是完全不同的。

而在面向對象的程序設計語言中,多態性意味者一個對象具有多個面孔。Java通過方法重載(overload)和方法覆蓋(override,也稱為方法重寫)來實現多態。

在一個類中聲明多個名字相同但參數不同(個數或類型)的方法,稱為方法重載。在子類中聲明與父類中完全相同的方法稱為方法覆蓋。

通過方法覆蓋,子類可以重新實現父類的某些方法,使其具有自己的特征。例如對于汽車類的加速方法,其子類(如賽車)中可能增加了一些新的部件來改善和提高加速性能,這時可以在賽車類中覆蓋父類的加速方法。覆蓋隱藏了父類的方法,使子類擁有自己的具體實現,更進一步表明了與父類相比,子類所具有的特殊性。

Java不僅允許程序設計者自己創建類,還針對各種應用提供了大量的預定義類庫,例如屏幕顯示、文件訪問、數學計算等方面的類庫。大量的預定義類的學習是Java語言學習的一個重點,也是一個難點。要掌握基本概念,通過對一些典型系統類的學習,學會舉一反三,觸類旁通。

有了有關類、對象的概念后,下面來看一看簡單的Java程序。

主站蜘蛛池模板: 汉沽区| 吉隆县| 自治县| 北安市| 田林县| 隆化县| 石泉县| 宿松县| 嘉峪关市| 邵阳县| 湖北省| 杨浦区| 华坪县| 贺州市| 古丈县| 合肥市| 铜山县| 辽源市| 栾川县| 都昌县| 许昌市| 开鲁县| 商都县| 东兰县| 崇州市| 西藏| 延庆县| 东方市| 沽源县| 宿松县| 磴口县| 太谷县| 堆龙德庆县| 会东县| 东源县| 龙陵县| 建瓯市| 休宁县| 漳浦县| 新源县| 阿瓦提县|