java 物件導向必懂概述

hebtu666發表於2019-01-30

(這是大體框架,以後部分知識細寫)

 

1    抽象過程

所有程式語言都提供抽象機制。可以認為,人們能解決的問題的複雜性直接取決於抽象的型別質量。

型別:指的是所抽象的是什麼。

組合語言是對底層機器語言的輕微抽象;

c、BASIC等命令式語言是對組合語言的抽象;

這些語言雖然有很大的改進,但是他們做的主要抽象仍要求在解決問題時基於計算機的結構而不是問題的結構。這就要求程式設計師必須建立起機器模型(計算機)和實際問題的模型(一項業務)之間的關聯。這是非常費力的,使得程式難編寫,維護代價高昂。

另一種建模方式是針對特定問題進行建模,對於要解決的特定型別的問題來說,他們是非常不錯的,但是一旦超出了特定領域,就顯得力不從心了。

物件導向的方式通過向程式設計師提供表示問題空間中的元素的工具而更進一步。我們把問題空間(計算機)中的元素和在解空間中的表示成為“物件”

Alan Kay總結了第一個成功的面嚮物件語言的五個特性:

1)萬物皆物件(理論上講,可以抽取問題的任何概念化構件,比如貓,建築、服務)

2)程式是物件的集合,他們通過傳送訊息來告知彼此要做的。

3)每個物件都有自己的由其他物件所構成的儲存(換句話說,可以通過建立包含現有物件的包來建立新型別物件)

4)每個物件都擁有自己的型別(每個物件都是某個類的例項,例如旺財是狗的例項)

5)某一特定型別的所有物件都可以接收同樣的資訊

簡潔來說,物件具有狀態、行為和標識。


2   類和物件

 

:類是一個模板,它描述一類物件的行為和狀態。(比如貓類狗類動物類)

物件:物件是類的一個例項,有狀態和行為。例如,一條狗是一個物件,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。

現在讓我們深入瞭解什麼是物件。看看周圍真實的世界,會發現身邊有很多物件,車,狗,人等等。所有這些物件都有自己的狀態和行為。拿一條狗來舉例,它的狀態有:名字、品種、顏色,行為有:叫、搖尾巴和跑。

對比現實物件和軟體物件,它們之間十分相似。軟體物件也有狀態和行為。軟體物件的狀態就是屬性,行為通過方法體現。在軟體開發中,方法操作物件內部狀態的改變,物件的相互呼叫也是通過方法來完成。

每種程式語言都有自己的操作記憶體中元素的物件,在java中,萬物都是物件。注意,我們操作的是物件的引用:可以想象成電視機和遙控器,我們操作的是遙控器。

String s;

建立了一個引用,也就是遙控,但是他現在不能操作電視。

儲存的地方有:

1)暫存器: 最快的儲存區,它位於處理器內部,人們不能直接控制,也不能在程式中感覺到暫存器的存在。

2)堆疊:位於RAM,通過堆疊指標可以從處理器獲得直接支援,靠指標移動來分配或釋放記憶體,這是快速有效的方法。建立程式時,java系統必須知道儲存在堆疊內的所有項的生命週期。(引用儲存在堆疊

3)堆:一種通用的記憶體池,存放所有的java物件。不需要知道儲存的資料的生命週期。但是用堆進行分配和清理會比用堆疊需要更多時間。

4)常量儲存:直接放在程式法程式碼內部,這樣做是安全的,因為它們永遠也不會改變,存放在ROM。

5)非RAM儲存:如果資料完全活在程式之外,它可以不受任何程式的控制。比如流物件和持久化物件

有的物件比較小、簡單,所以儲存在堆裡往往不是很好,我們把他們存在堆裡就可以了,這種物件我們把他們叫做基本型別。

boolean\char\byte\short\int\long\float\double\void


3   提供部分服務

 

當正在開發或者試圖理解一個程式設計時,最好的方法之一就是將物件想象為一個服務的提供者。

因為程式本身一定會向使用者提供服務,它將呼叫其他物件的服務來實現這一目的,我們的目標就是去建立能夠提供理想的服務來解決問題的一系列物件。遇到需求請問一下自己:“如果我將問題從表象中抽取出來,什麼樣的物件可以解決我的問題?”他們看起來是什麼樣子?他們能夠提供哪些服務?他們需要哪些物件才能履行他們的義務?如此持續的這樣做,我們會發現“這個物件好像挺簡單”。

將物件想象為一個服務的提供者,有助於提高內聚性。

人們設計物件面臨的一個問題是:將過多的功能放到了一個物件中。在良好的物件導向設計中,每個物件都可以良好的完成一個任務,但是它並不試圖做更多的事。


4   隱藏

將開發人員分為類建立者和客戶端程式設計師是非常科學的。客戶端程式設計師的目標是收集各種用來實現快速應用開發的類。而類的建立者的目標是構建類,這種類只向客戶端程式設計師暴露必須的部分,隱藏其他的部分。被隱藏的部分通常是物件內部比較脆弱的部分,他們很容易被粗心或不知內情的客戶端程式設計師毀壞,所以被隱藏(保護)起來。

java用三個關鍵字設定邊界:

public 對任何人可用。

private除了建立者和物件內部方法,其他任何人都不能訪問,這就像是和客戶端程式設計師的一堵牆,或者說是程式的保護傘。

protected和private類似,區別是繼承的類可以訪問。

無關鍵字為包許可權,可以訪問同一個包的其他類成員。


5   複用

一旦類被建立並測試完,他就應該被視為有用的程式碼單元。程式碼複用是物件導向程式設計語言所提供的最了不起的優點之一。

兩種複用方法:

1)組合:把已知類放入新的類中,新的類可以由任意數量、型別的其它類組成。就像拿零件組裝汽車。

 

注意:組合帶來了極大的靈活性。由於繼承在物件導向中如此重要,所以經常被高度強調,很多程式設計師因此忽視了組合,處處都繼承,有時候,這樣是不科學的,不符合常理的,會導致過分複雜的設計。在建立新類時,應優先考慮組合。

 

2)繼承:我們以現有的類為基礎,新增和修改副本來建立新類。就是繼承。經典例子就是圖形:每一個圖形都有尺寸、顏色、位置等,都可以被繪製、擦出、移動、著色等。在此基礎上,可以有圓形、正方形、三角形等。他們每一個圖形都具有圖形類的特點,並有屬於自己的特點。

 

注意:繼承是否應該只繼承基類的屬性方法,而不新增新的屬性和方法呢?

如果這樣做,就意味著新類和基類是完全相同的資料型別,因為它們具有完全相同的介面。這可以被視作純粹替代,這是一種處理繼承的理想方式。這種關係為is a的關係,比如“圓形是一個(is a)形狀”。

有時必須新增新的介面元素。這樣其實並不完美,因為基類無法訪問新的方法。這種情況是is like a(像是),比如空調,房子具備了讓你控制冷氣的介面和製冷空調,後來你用了能製冷制熱的新裝置替換了空調,但是房子的設計就是隻涉及==設計了製冷介面,所以儘管新物件介面擴充套件了,但是現有系統對新街口一無所知。


6   多型

 

多型:同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。

比如你是一個酒神,對酒情有獨鍾。某日回家發現桌上有幾個杯子裡面都裝了白酒,從外面看我們是不可能知道這是些什麼酒,只有喝了之後才能夠猜出來是何種酒。你一喝,這是劍南春、再喝這是五糧液、再喝這是酒鬼酒….在這裡我們可以描述成如下:

      酒 a = 劍南春

      酒 b = 五糧液

      酒 c = 酒鬼酒

      …

      這裡所表現的的就是多型。劍南春、五糧液、酒鬼酒都是酒的子類,我們只是通過酒這一個父類就能夠引用不同的子類,這就是多型——我們只有在執行的時候才會知道引用變數所指向的具體例項物件。

 

注意:我們或許都寫過這樣的方法:它接收一個基類引數,比如酒,然後不管這個酒是哪種酒,都能執行對應的方法。

這些程式碼不是:“如果是劍南春,就這樣做,是五糧液,就那樣做。。。。。。”

而是:“你是酒,我知道你是酒,我知道你可以做一些事,那麼,就去做吧”


7   單根繼承

 

在物件導向程式設計中,有一個很矚目的問題:是否所有類最終都繼承自單一的類。

在java中,答案是:是的。

而c++則不是。

具體利弊以後會解釋


8   容器

如果不知道在解決問題時需要多少物件,或者存活多久,那就不可能知道怎麼儲存他們了。

容器(也稱為集合)在任何需要的時候都可以擴充自己以容納所有的東西。

好的OOP語言都有屬於自己的容器,比如c++的STL,Object Pascal的VCL,java也一樣有大量容器,有list、set、map等。

 

9   生命期

 

10   錯誤

 

11   併發

 

 

 

 

相關文章