Thinking in Java - 學習筆記 - (一)對象導論

面向對象程序設計方式

  1. 萬物皆爲對象
  2. 程序是對象的集合,它們通過發送消息來告知彼此所要做的
  3. 每個對象者有自己的由其他對象所構成的存儲
  4. 每個對象都擁有其類型
  5. 某一特定類型的所有對象都可以接收同樣的消息

Booch 對對象提出了一個更加簡潔的描述:對象具有狀態、行爲和標識。


隱藏實現細節

訪問控制

  1. 讓客戶端程序員無法觸及他們不應該觸及的部分。
  2. 允許庫設計者可以改變類內部的工作方式而不用擔心會影響到客戶端程序員。

訪問指定詞 - access specifier

public, private, protected

當不使用訪問指定詞時,默認訪問權限–包訪問權限–將發揮作用。


複用具體實現

  • 組合(composttion):使用現有的類合成新的類,“has-a” 關係
  • 聚合(aggregation):動態發生的組合

繼承

  • 導出類無法訪問基類的private成員
  • 導出類複製了基類的接口,所有發送給基類對象的消息同時也可以發送給導出類對象。也就意味着導出類與基類具有相同的類型。

有兩種方法可以使基類與導出類產生差異
1. 直接在導出類中添加新方法:is-like-a(像是一個)關係
2. 覆蓋(overriding):is-a(是一個)關係


多態

在處理類型的層次結構時,經常想把一個對象不當作它所屬的特定類型來對待,而是將其當作其基類的對象來對待。

但是,在試圖將導出類型的對象當作其泛化基類型對象來看待時,仍然存在一個問題。如果某個方法要讓泛化幾何形狀繪製自己、讓泛化交通工具行駛,那麼編譯器是不可能知道應該執行哪一段代碼的。

編譯器不可能產生傳統意義上的函數調用。

一個非面向對象編程的編譯器產生的函數調用會引起所謂的前期綁定,這麼做意味着編譯器將產生對一個具體函數名字的調用,而運行時將這個調用解析到將要被執行的代碼的絕對地址。

爲解決這個問題,面向對象程序設計語言使用了後期綁定的概念。當向對象發送消息時,被調用的代碼直到運行時才能確定。

  1. 爲了執行後期綁定,Java使用一小段特殊的代碼來替代絕對地址調用。
  2. 在Java中,動態綁定是默認行爲,不需要添加額外的關鍵字來實現多態。

一個例子

    void doSomething(Shape shape) {
        shape.erase();
        // ...
        shape.draw();
    }
    Circle circle = new Circle();
    doSomething(circle);

Circle被傳入到預期接收Shape的方法中,由於Circle可以被doSomething()看作是Shape,所以這樣做是完全安全且合乎邏輯的。

把將導出類看做是它的基類的過程稱爲向上轉型(upcasting)。


單根繼承結構

在Java中,所有的類最終都繼承自單一的基類,這個終極基類的名字就是Object。

  • 在單繼承結構中的所有對象都具有一個共用接口,所以它們歸根到底都是相同的基本類型。
  • 單根繼承結構保證所有對象都具備某些功能。
  • 單根繼承結構使垃圾回收器的實現變得容易得多。

容器

如何才能知道需要多少空間來創建這些對象呢?答案是不可能知道,因爲這類信息只有在運行時才能獲得。
面向對象設計的解決方案:創建另一種對象類型。這種新的對象類型持有對其他對象的引用。(通常被稱爲容器)

參數化類型

參數化類型機制:創建這樣的容器,它知道自己所保存的對象的類型,從而不需要向下轉型以及消除犯錯誤的可能。(在Java中稱爲範型)

ArrayList<Shape> shapes = new ArrayList<Shape>();

對象的創建和生命期

在使用對象時,最關鍵的問題之一便是它們的生成和銷燬方式。每個對象爲了生存都需要資源,尤其是內存。當我們不再需要一個對象時,它必須被清理掉,使其佔有的資源可以被釋放和重用。

如何控制對象的生命週期?

  • C++認爲效率控制是啊重要的議題,所以給程序員供了選擇的權力爲也追求最大的執行速度,對象的存儲空間和生命週期可以在編寫程序是確定,這可以通過將對象置於堆棧(它們有時被稱爲自動變量(automatic varivable)或限域變量(scoped variable))或靜態存儲區域內來實現。
  • 在被稱爲(heap)的內存池中動態地創建對象。在這種方式中,直到運行時才知道需要多少對象,它們的生命週期如何,以及它們的具體類型是什麼。這些問題的答案只能在程序運行時相關代碼被執行到的那一刻才能確定。

異常處理:處理錯誤

  • 異常不能被忽略,所以它保證一定會在某處得到處理。
  • 異常提供了一種從錯誤狀況進行可靠恢復的途徑。
  • 異常處理不是面向對象的特徵——儘管在面嚮對象語言中異常常被表示成爲一個對象。異常處理在面嚮對象語言出現之前就已經存在了。

併發編程

在計算機編程中有一個基本概念,就是在同一時刻處理多個任務的思想。
把問題切分成多個可獨立運行的部分(任務),從而提高程序的響應能力。在程序中,這些彼此獨立運行的部分稱之爲線程,上述概念被稱爲“併發”。

併發的隱患:共享資源。


Java 與 Internet

術語
CGI: common gateway interface
GUI: graphic user interface

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章