735
技術社區[雲棲]
Java4android學習之對象導論
今天開始的這個禮拜,回補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。
最後更新:2017-04-03 05:40:12