標籤:java4android 對象 oop
今天開始的這個礼拜,回補java基本知識,再次回爐學習。
1 , 程式員必須建立起在機器模型和設計待解問題的模型之間的關聯。建立這種關聯是費力的,而且不屬於程式設計語言所固有的功能,使得編程難以編寫,並且維護代價高昂,同時也產生了作為副產物的整個“編程方法”行業。
2,對象具有狀態,行為和標識。狀態:每個對象可以擁有內部資料(它給出了對象的狀態);方法:它們產生的行為;並且每個對象都可以和其他對象區分開來,具體就是每個對象在記憶體中都存在唯一的地址。
3,每個對象都有一個介面。建立抽象資料類型(類)是物件導向程式設計的基本概念之一。類描述了具有相同特性(資料元素)和行為(功能)的對象集合。介面確定了對某一特定對象所能發出的請求。在程式中必須要有滿足這些請求的代碼,這就是實現。向某個對象發送訊息,其實就是產生某個請求,而請求和方法關聯,自然就進行了方法的調用。
4,每個對象都提供服務。我們需要構建一個合理的對象來解決我們面臨的問題。所以如何將問題分解為對象是我們需要思考的問題。高內聚是軟體設計的基本要求之一,這意味著一個軟體構件的各個方面“組合”的很好。
5, 被隱藏的具體實現。將程式開發人員按照角色分為“建立者”(那些建立新資料類型的程式員)和“用戶端程式員”(那些在應用中使用資料類型的消費者)是大有裨益的。一個類被隱藏的部分意味著建立者可以任意的修改它而不用擔心對其他人造成影響。被隱藏的部分也是對象內部脆弱的部分,很容易被粗心的或者不知內情的用戶端程式員所毀壞,因此將實現隱藏起來可以減少程式的bug。
存取控制的第一個存在原因是讓用戶端程式員無法觸及他們不該觸及的部分。第二個存在的原因是允許庫設計者可以改變類內部的工作方式而不用擔心影響到用戶端程式員。
6,複用具體實現。代碼複用是物件導向程式設計語言所提供的最了不起的優點之一。組合(composition)和彙總(aggregation)。組合常被視為“has-a”(擁有)關係。組合和彙總的區別是大多數人頭痛的問題。彙總更為鬆散,它是“如果組合是動態發生的,那麼它就是彙總”。可能還是很抽象,這我不得不舉個《大話》裡面的例子。組合,就好比大雁的翅膀和大雁的關係,大雁如果沒了,大雁的翅膀肯定也就沒了。彙總,就是大雁和雁群的關係,一個大雁它可以隨時的加入到一個雁群裡面,它還可以離開。關係就鬆散多了。
還有,能用組合關係就盡量用組合關係,而不是繼承。
7,繼承。為什麼要有繼承?因為我們想偷懶,當我們實現了一個類的時候,另外一個跟它類似的類,我們還是要重新定義,我們多麼渴望通過拷貝現有的類然後改改就能夠定義新的類。於是就有了“繼承”。繼承有個父類(基類),然後就是子類(匯出類)。子類繼承父類,父類的改動也會反映到子類。
當繼承現有類型時,也就創造了新的類型。這個新的類型不僅包含了現有類型的所有成員(儘管private成員被隱藏起來了,而且不能訪問),而且更為重要的是它複製了基類的介面。也就是說,所有可以發送給基類對象的訊息都可以發送給匯出類的對象。匯出類和基類對介面的不同實現,即覆蓋(Overriding)。匯出類如果添加了新的介面,基類是無法訪問的。這種關係雖然是繼承,但是不是純粹替代。叫"is-like-a",而不是“is-a"。
8,伴隨多態的可互換對象。在處理類型的階層時候,經常把一個對象不當做它所屬的特定類型來對待,而是將其當做基類的對象來對待。這使得我們可以編寫出不依賴特定類型的代碼。泛化(Generic)。添加新的類,並不需要更改調用它的地方,都統一採用基類來看待,來傳遞訊息,卻能夠根據所傳遞的對象自身類型執行不同的實現。
那麼如何?這個機制的呢?這就引出了”前期綁定“和”後期綁定“。後期綁定是在程式啟動並執行時候才能夠確定它所調用的代碼。(C++中採用virtual關鍵字來實現的,而Java中預設就開啟)。把匯出類看做是它的基類的過程叫做向上轉型(Upcasting)
9,單根繼承。C++ 和Java最爭論的一個重要問題就是單繼承和多繼承的問題。這個問題各有各的好處,不過建議就是,如果你公司的代碼以前有很多C代碼,那麼C++ 是比較好的;如果你的項目是從頭開始,建議用Java。
10,容器。C++中,容器是標準C++ 類庫的一部分,經常被稱為標準模板庫(Standard Template Library,STL)。Java中,具有滿足不同需要的各種容器。在Java SE5之前,之前,容器的對象只有Java中通用類型:Object,這樣進了容器,就只知道是Object類型,取出來的時候類型消失了,所以你要自己顯式的向下轉型,就是將Object轉為你的類型,但有個問題,除非你確切的知道放進去的是什麼,否則很容易發生放進去的是蘋果,結果你非得說人家是鳳梨,然後用鳳梨在轉人家,這樣是會發生異常的。。
在Java SE5之後,Java容器增加了參數化型別,Java叫它範型。eg. ArrayList<Shap> shapes=new ArrayList<Shap>();這樣就限定了我這個容器,只能夠裝Shape類型(當然,你懂得它的匯出類也就是)。
11,對象的建立和生命期。C++認為效率控制是最重要的議題,所以它給了程式員選擇的權利。為了追求最大的執行速度,對象的儲存空間和生命期可以在編寫程式的時候確定。Java是採用了動態記憶體分配的方式,在堆(Heap)記憶體池中動態建立對象。Java具有記憶體回收機制,當沒有人引用這個對象的時候,對象會被釋放。
12,異常處理:處理錯誤。異常發生的時候是不可以忽略的,你必須進行相應的處理,你可以在裡面選擇進一步校正,使得程式再次回到正規,或者你可以輸出調試資訊。而在C和C++中,經常用返回錯誤碼來表示錯誤。但是,調用者卻可以忽略你的錯誤碼。。。所以,異常是具有強制性的。
13,並發編程。多線程問題。
14,Java和Internet。
Java4android學習之對象導論