Thinking in Java-對象導論

1. 對象導論

1.1 抽象過程

  1. 面向對象的語言有五個特色java

    • 萬物皆爲對象
    • 程序是對象的集合,它們經過發消息來通信

      <!--一盞電燈是一個程序,燈泡、燈座則爲對象-->編程

    • 每一個對象都有本身的由其餘對象所構成的存儲
    • 每一個對象都有類型
    • 某特定類型的全部對象都能收到一樣的消息

      <!--父類幾何體,子類圓形、正方形,子類對象都能收到幾何體類型的信息-->瀏覽器

1.2 每一個對象都有一個接口

  1. 發送消息(產生請求):當向對象發送請求時,相關聯的方法就會被調用
每一個對象都是定義了特性和行爲的某個特定的類

1.3 每一個對象都提供服務

把對象當作服務提供者,有利於造成對象的高內聚

1.4 訪問指定詞

<!--被隱藏的具體實現-->服務器

  1. 訪問指定詞併發

    • public:任何人都能訪問
    • private:僅類型的建立者和類型內部方法可以使用
    • protected:除類型的建立者和類型內部方法可以使用;繼承的類也能訪問(與private的區別)
    • 默認(包訪問權限):同一個包中的可以訪問

1.5 複用具體實現

  1. 組合:使用現有的類合成新的類,常常被視爲(has-a)擁有關係
  2. 聚合:動態發生的組合

1.6 繼承

  1. 定義:以現有類爲基礎,複製出副本,並在副本上修改和添加來建立新類函數

    • 現有類稱爲基類、源類、父類
  • 副本類稱爲導出類、繼承類、子類插件

    • 經過繼承產生的類型具備類型等價性

      <!--發給基類對象的消息同時也能發給導出類-->線程

  1. 使基類和導出類差別的兩個方法設計

    • 在導出類添加新方法
    • 在導出類中改變基類的方法(簡稱覆蓋)

1.6.1 繼承的分類

  1. 純粹替代(也稱替代原則):用一個導出類對象來徹底替代一個基類對象
  2. 不徹底替代:在導出類中擴展接口,但基類沒法訪問新添加的方法

1.7 多態

  1. 泛化:處理類型的層次結構時,不把對象看成特定類型處理,而是做爲基類的對象處理code

    <!--好比處理三角形、圓形、矩形,不做爲特殊類處理,而是統一當作形狀,由於都有繪製、移動等方法-->

    面向對象程序設計的最重要妙訣:編譯器不可能產生傳統意義上的函數調用,而是採用前期綁定和後期綁定的方法
  2. 後期綁定:向對象發送消息時,被調用的代碼直到運行時才能肯定;再運行前,編譯器僅僅確認調用方法的存在、被調用參數和返回值類型檢查

    因爲OOP中,動態綁定是默認行爲,因此程序直到運行時才肯定代碼的位置;根據消息來肯定具體調用的代碼,所以是動態的
  3. 多態:同一事物在不一樣場景下的多種形態

    • 因爲動態綁定是默認行爲,因此在運行前沒法肯定調用的代碼,所以根據消息來執行後期綁定,實現多態

      <!--示例代碼-->

      當draw()消息發到一個匿名Shape時,會基於該Shape的實際類型產生正確的行爲

      void doSomething(Shape shape){
          shape.draw();
        shape.rease();
      }
      Circle circle = new Circle();
      Triangle triangle = new Triangle();
      Line line = new Line();
      doSomething(circle);
      doSomething(triangle);
      doSomething(line);

1.8單根繼承結構

  1. 單根繼承:全部類最終都繼承自單一的基類
  2. 優點

    • 保證全部對象必定具有某些功能,方便執行基本操做
    • 方便垃圾回收,由於全部對象都能肯定類型

1.9容器

  1. 實際開發中,須要選擇合適容器,緣由爲

    • 不一樣容器有各自的接口和行爲
    • 不一樣容器效率不一樣

1.9.1參數化類型

  1. 範型:參數化類型,使用一對尖括號,中間包含類型信息

    ArrayList<Shape> shapes = new ArrayList<Shape>();
  2. 向下轉型:向下轉型成爲更加具體的類

    • 向下轉型的行爲存在風險,會出現異常

<!--好比:Circle是Shape的一個類,可是沒法得知某個Object是Shape類仍是Circle類-->

1.10對象的建立和生命週期

  1. 對象的存儲

    • 對象置於堆棧或靜態存儲區域來實現:犧牲靈活性,存儲空間分配優先考慮
    • 在堆(heap)的內存池中動態的建立對象:保證靈活性,但直到運行時才知道對象數量
    • Java採用動態內存分配方式
  2. 對象的生命週期

    • java有垃圾回收器,所以可以自動釋放對象佔用的內存
    • C++須要手動銷燬對象,否則可能致使內存泄漏

1.11異常處理:處理錯誤

異常處理提供了一種從錯誤狀態進行可靠恢復的途徑

1.12併發編程

  1. 線程:彼此獨立運行的部分
  2. 併發:多個線程同時運行

1.13Java與Internet

1.13.1Web

  1. 服務器:信息存儲池、用於分發信息的軟件以及信息和軟件所駐留的機器或機羣

1.13.2客戶端編程

  1. 通用網關接口(CGI):數據表單的提交經過CGI傳遞
  2. 插件(plug-in):下載一段代碼,插入到瀏覽器中適當位置,來擴展瀏覽器功能
相關文章
相關標籤/搜索