首頁 >Java >java教程 >java對象導論的詳細介紹

java對象導論的詳細介紹

黄舟
黄舟原創
2017-03-01 11:13:111163瀏覽

(一)事物的抽象過程

人們所能解決的問題的複雜性,取決於能將事物抽象到什麼程度。

高等的數學和物理就是對事物高度的抽象。它們在那種極度抽象的層次來研究,一旦獲得大的進展,就會對我們日常生活造成極大的影響,例如愛因斯坦的相對論,它的發現對世界的影響就是巨大的。程式設計也是這樣,我們將一些日常事物進行抽象,抽象的程度越高,我們就越可以用簡潔的程式碼來描述它。

Alan Kay曾經總結了第一個成功的物件導向語言、同時也是java所基於的語言之一的Smalltalk的五個基本特性,這些特性表現了一種純粹的物件導向的設計方式:

  1. 萬物皆為物件

  2. 程式是物件的集合,他們透過發送訊息告知彼此要做何事

  3. 每個物件都有自己的由其他物件所構成的儲存

  4. 每個物件都擁有其類型

  5. 某一特定類型的所有物件都可以接收同樣的訊息

#或是我們可以對物件進行更簡潔的描述:物件具有狀態、行為和標識。每個物件都有內部資料、方法和唯一的位址。

(二)每個物件都有自己的功能

所有的物件都是唯一的,但同時具有相同的特性和行為的物件所歸屬的類別的一部分。這就例如,天空中有很多麻雀,每個麻雀都是一個獨立的個體,但是這些個體都是麻雀,它們都有著麻雀的特性。

每個物件都是一個服務的提供者,我們可以透過呼叫這個物件中的方法,使用物件中的變數來進行自己的操作。將物件視為服務提供者還有一個附帶的好處:這有助於提高物件的內聚性。 高內聚是軟體設計的基本品質要求之一,這意味著一個軟體結構組織的很好,在這個類別中,所有的方法和屬性都為了一個功能而生,這些方法和屬性聚集在一起,使用時非常便捷。但是我們在日常設計物件的時候面臨的一個問題是,我們常常將過多的功能都塞在一個物件中。
在良好的物件導向設計中,每個物件都可以很好的完成一項任務,他們並不試圖做更多的事情。這樣的設計會有這另外一個好處:低耦合。因為每個物件都有著自己高度內聚的屬性方法,他們都為了做自己的「分內之事」而生,多個不同類型物件間透過將各自的功能拼搭,從而達到這種低耦合的效果。

(三)封裝性-被隱藏的具體實現

在電腦網路結構的七層模型中,各個層之間互相封閉,最終完成了從最虛擬的電腦操作到做底層的電子線路操作這整套的網路結構。在它的層與層之間,上一層只能看得到下一層方法的接口,他只能知道如何去調用下一層的方法,而對下一層的具體程式碼實作並不感興趣。
在java的程式碼中,使用了三個關鍵字在類別中設定邊界,這三個存取指定字決定了緊接在其後的內容可以被誰使用:

  1. ##public:                 當前類別 目前包 子孫類 其他套件

  2. protected:        # #當

    ##protected:        # #當前類別

     (無修飾):   目前類別 目前套件
  3. private:目前類別
(四)重複使用與組合

程式碼的複用與組合是物件導向程式設計語言所提供的最了不起的優點之一。

最簡單的複用的方式就是:直接使用該類別的一個物件。此外,也可以將那個類別的一個物件至於某個新的類別中,我們稱這種複用方式為「建立一個成員物件」。新的類別可以由任意數量、任意類型的其他物件以任意可以實現新的類別中想要的功能的方式所組合。因為是在使用現有的類別合成新的類,所以這種概念被稱為

組合

我們通常將組合視為擁有關係—「has-a」。 相比較許多新手非常喜歡在自己的類別中使用繼承關係,實際上,在建立新類別時應該首先考慮組合,因為它更加靈活。如果採用這種組合的方式,設計會變得更加清晰。

(五)繼承

我們就不介紹繼承是什麼意思了,值得一提的是,當我們在專案中去考慮如何抽像出父類別時可以思考多個子類,用多個子類來找出他們的共同點,這樣對我們抽象父類很有幫助。

因為繼承的關係,所有可以傳送給基底類別物件的訊息同時也可以傳送給子類別物件。這就意味著,實際上,子類別與父類別具有相同的類型。如果我們只是繼承了父類,在父類中只重寫方法而不創建新的方法,我們可以稱之為純粹替代,對於純粹替代,我們用——“is-a”來表示這種關係。對於那些不僅繼承了父類,而且在父類的基礎上添加了新的方法,我們用——「is-like-a」來表示這種關係。

(六)多態性與後期綁定特徵

在處理層次結構時,我們常常把一個物件不當作某個特定的物件來處理,而是作為他們的父類來對待。例如,我們需要傳入一個列表,這時我們在方法的參數中不需區分到底是ArrayList列表還是LinkedList列表,我們只需寫上List列表即可。這種多態性讓程式極大的豐富化。

但是說到這裡存在一個最簡單卻又很難說清楚的問題:例如上述的方法在傳入一個列表後要呼叫add函數,這個方法怎麼知道傳入的List呼叫哪個add函數呢?

這個問題的答案,也是物件導向程式設計的最重要的妙訣:編譯器不產生傳統意義上的前期綁定的函數調用,而是採用後期綁定的方法。一個非面向對象變成的編譯器產生的函數調用會引起所謂的前期綁定,這個綁定方法意味著編譯器將產生一個具體函數名字的調用,而運行時將這個調用解析到將要被執行的程式碼的絕對位址。 OOP為了解決這個問題使用了後期綁定的概念。當向物件發送訊息時,被呼叫的程式碼直到運行時才能確定。編譯器確保被呼叫的方法存在,並對參數傳回值進行檢查,但並不知道將被執行的確切程式碼。

在C++中,必須明確的透過關鍵字virtual來宣告希望某個方法具備後期綁定屬性所帶來的彈性,也就是說預設並非後期綁定。而在java中動態綁定是預設行為。

(七)單根繼承結構

在java中,所有的類別最終都繼承於單一的基類,而這個基類就是Object。 事實證明,單根繼承結構帶來了許多好處。單根繼承使得垃圾回收器的實現變得容易的多。由於所有物件都保證具有其類型訊息,因此不會因無法確定物件的類型而陷入僵局。

(八)物件創建和生命週期

當談到物件的創建和生命週期時,腦海中不禁浮現出了很多種語言,這些語言對它的處理各不相同。 C++認為效率控制是最重要的議題,所以,C++給了程式設計師選擇的權利。可以自己new,但是必須要delete掉new出來的空間,否則會陷入著名的記憶體洩漏的問題之中。
在java中,所有的物件都是在堆的記憶體池中動態地建立的。 這種方式中,知道運行時才知道需要多少對象,他們的生命週期如何,以及他們的具體類型是什麼。這樣的問題只有在程式運行時相關程式碼被執行的那一刻才能確定。所以需要大量的時間在堆中分配儲存空間,這可能遠大於在堆疊中建立儲存空間的時間。在堆疊中建立儲存空間和釋放儲存空間通常都只需要一條指令。創建堆儲存空間的時間依賴於儲存機制的設計。

(九)異常處理

異常是一種物件。他從出錯地點被「拋出」。並被專門設計用來處理特定類型錯誤的相應的異常處理器「捕獲」。異常處理就像是與程式正常執行路徑並行的,在錯誤發生時執行的另一條路徑。因為他是一條完全分離的執行路線,所以它不會幹擾正常執行的程式碼。

值得注意的是:異常處理不是物件導向的特徵-儘管在物件導向語言中異常處理常被表示成一個物件。異常處理在物件導向語言出現之前就已經存在了。

 以上就是java物件導論的詳細介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!


#
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn