Java程式設計思想的讀書筆記第一章——物件導論
“我們之所以將自然界分解,組織成各種概念,並按其含義分類,主要是因為我們是整個口語交流社會共同遵守的協定的參與者,這個協定以語言的形式固定下來......除非贊成這個協定中規定的有關語言資訊的組織和分類,否則我們根本無法交談。”——Benjamin Lee Whorf(1897-1941)
計算機是頭腦延伸的工具,同時還是一種不同型別的表達媒體,如寫作、繪畫、雕刻、動畫、電影等一樣的表達形式。面向物件程式設計(Object-oriented Programming,OOP)作為其中一部分。
1)萬物皆為物件,你可以抽取待求解問題的任何概念化構件(狗、建築物、服務等),將其表示為程式中的物件。
2)程式是物件的集合,他們透過傳送訊息來告知彼此所要做的,可以把訊息想像為對某個特定物件的方法的呼叫請求。
3)每個物件都有自己的由其他物件所構成的儲存。
4)每個物件都擁有型別,每個物件都是某一個類(class)的一個例項(instance),每個類最重要的區別於其他類的特性就是“可以傳送什麼樣的訊息給他”。
5)某一特定型別的所有物件都可以接收同樣的訊息。物件具有狀態、行為和標識,每一個物件在記憶體中都有一個唯一的地址。
類描述了具有相同特性(資料元素)和行為(功能)的物件集合,當正在試圖開發或理解一個程式設計時,最好的方法之一就是將物件想像為“服務提供者”,程式本身將向用戶提供服務,它將透過呼叫其他物件提供的服務來實現這一目的。你的目標是去建立(或者最好是在現有程式碼庫中尋找)能夠提供理想的服務來解決問題的一系列物件。著手從事這件事的一種方式就是問一下自己:“如果我可以將問題從表象中抽取出來,那什麼樣的物件可以馬上解決我的問題呢?”
Java訪問控制包含四類:public、private、protected、預設。public對於任何人都是可用的;private只對於型別建立者和型別的內部方法可用,其餘任何人都不可用;protected關鍵字與private作用範圍相當,差別僅在於繼承的類可以訪問protected成員,但是不能訪問private成員;預設訪問許可權也就是包訪問許可權,只能供同包同路徑成員訪問,在包之外的成員都不能訪問。
繼承是以現有的類為基礎,複製它,然後透過新增和修改來建立新型別,有兩種方法可以使基類和匯出類產生差異,第一種方法是直接在匯出類中新增新方法,第二種方法是改變現有基類方法的行為,覆蓋基類的某個方法,在匯出類中建立該方法的新定義,使用與基類相同的介面方法,但是在新型別中做些不同的事情。伴隨多型的可互換物件,一個非面向物件程式設計的編譯器產生的函式呼叫會引起所謂的前期繫結,面向物件程式設計語言使用了後期繫結的概念,當向物件傳送訊息時,被呼叫的程式碼直到執行時才能確定,為了執行後期繫結,Java使用一小段特殊的程式碼來替代絕對地址呼叫,這段程式碼使用在物件中儲存的的資訊來計算方法體的地址。
把將匯出類看做是他的基類的過程稱為向上轉型。把基類向下轉型為更具體的型別稱為向下轉型,向上轉型是安全的,除非確切知道所要處理的物件的型別,否則向下轉型是危險的。向下轉型和執行時的檢查需要額外的程式執行時間,也需要程式設計師付出更多心血,解決方案是引數化型別機制,編譯器可以自動定製作用於特定型別上的類。例如,透過引數化型別,編譯器可以定製一個只接收和取出Shape物件的容器。例如,ArrayList<Shape> shapes=new ArrayList<Shape>();
容器的常見分類包含:List,Map,Set,Stack
在計算機程式設計中有一個基本概念,就是在同一時刻處理多個任務的思想,併發程式設計。
當面對各種令人眼花繚亂的解決客戶端程式設計問題的方案時,最好的方法就是進行價效比分析。認真考慮問題的各種限制,然後思考哪種解決方案可以成為最短的捷徑。
總結
過程型語言面向的是計算機,而不是你要解決的問題。OOP則不同,重要的是要正確評估自己的需求,並決定Java是否能最好地滿足這些需求,還是使用其他的程式設計系統(包括你當前正在使用的)才是更好的選擇。如果知道自己的需求在可預見的未來會變得非常特殊化,並且Java可能不能滿足你的具體限制,那麼就應該去考察其他的選擇(我特別推薦讀者看看Python,參見www.Python.org)。即使最終仍舊選擇Java作為程式語言,至少也要理解還有哪些選項可供選擇,並且對為什麼選擇這個方向要有清楚的認識。