Thinking in Java

1. 對象導(dǎo)論

1.1 抽象過程

  1. 面向?qū)ο蟮恼Z言有五個特點

    • 萬物皆為對象

    • 程序是對象的集合,它們通過發(fā)消息來通訊

    • 每個對象都有自己的由其他對象所構(gòu)成的存儲

    • 每個對象都有類型

    • 某特定類型的所有對象都能收到同樣的消息

1.2 每個對象都有一個接口

  1. 發(fā)送消息(產(chǎn)生請求):當(dāng)向?qū)ο蟀l(fā)送請求時,相關(guān)聯(lián)的方法就會被調(diào)用

每個對象都是定義了特性和行為的某個特定的類

1.3 每個對象都提供服務(wù)

把對象看成服務(wù)提供者,有利于形成對象的高內(nèi)聚

1.4 訪問指定詞

  1. 訪問指定詞
    • public:任何人都能訪問
    • private:僅類型的創(chuàng)建者和類型內(nèi)部方法能夠使用
    • protected:除類型的創(chuàng)建者和類型內(nèi)部方法能夠使用;繼承的類也能訪問(與private的區(qū)別)
    • 默認(rèn)(包訪問權(quán)限):同一個包中的能夠訪問

1.5 復(fù)用具體實現(xiàn)

  1. 組合:使用現(xiàn)有的類合成新的類,經(jīng)常被視為(has-a)擁有關(guān)系
  2. 聚合:動態(tài)發(fā)生的組合

1.6 繼承

  1. 定義:以現(xiàn)有類為基礎(chǔ),復(fù)制出副本,并在副本上修改和添加來創(chuàng)建新類
    • 現(xiàn)有類稱為基類、源類、父類
  • 副本類稱為導(dǎo)出類、繼承類、子類

    • 通過繼承產(chǎn)生的類型具有類型等價性

  1. 使基類和導(dǎo)出類差異的兩個方法
    • 在導(dǎo)出類添加新方法
    • 在導(dǎo)出類中改變基類的方法(簡稱覆蓋)

1.6.1 繼承的分類

  1. 純粹替代(也稱替代原則):用一個導(dǎo)出類對象來完全替代一個基類對象
  2. 不完全替代:在導(dǎo)出類中擴(kuò)展接口,但基類無法訪問新添加的方法

1.7 多態(tài)

  1. 泛化:處理類型的層次結(jié)構(gòu)時,不把對象當(dāng)作特定類型處理,而是作為基類的對象處理

    ?面向?qū)ο蟪绦蛟O(shè)計的最重要妙訣:編譯器不可能產(chǎn)生傳統(tǒng)意義上的函數(shù)調(diào)用,而是采用前期綁定和后期綁定的方法

  2. 后期綁定:向?qū)ο蟀l(fā)送消息時,被調(diào)用的代碼直到運(yùn)行時才能確定;再運(yùn)行前,編譯器僅僅確認(rèn)調(diào)用方法的存在、被調(diào)用參數(shù)和返回值類型檢查

    由于OOP中,動態(tài)綁定是默認(rèn)行為,所以程序直到運(yùn)行時才確定代碼的位置;根據(jù)消息來確定具體調(diào)用的代碼,因此是動態(tài)的

  3. 多態(tài):同一事物在不同場景下的多種形態(tài)

    • 由于動態(tài)綁定是默認(rèn)行為,所以在運(yùn)行前無法確定調(diào)用的代碼,因此根據(jù)消息來執(zhí)行后期綁定,實現(xiàn)多態(tài)

      當(dāng)draw()消息發(fā)到一個匿名Shape時,會基于該Shape的實際類型產(chǎn)生正確的行為

      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單根繼承結(jié)構(gòu)

  1. 單根繼承:所有類最終都繼承自單一的基類
  2. 優(yōu)勢
    • 保證所有對象一定具備某些功能,方便執(zhí)行基本操作
    • 方便垃圾回收,因為所有對象都能確定類型

1.9容器

  1. 實際開發(fā)中,需要選擇合適容器,原因為
    • 不同容器有各自的接口和行為
    • 不同容器效率不同

1.9.1參數(shù)化類型

  1. 范型:參數(shù)化類型,使用一對尖括號,中間包含類型信息

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

    • 向下轉(zhuǎn)型的行為存在風(fēng)險,會出現(xiàn)異常

1.10對象的創(chuàng)建和生命周期

  1. 對象的存儲
    • 對象置于堆?;蜢o態(tài)存儲區(qū)域來實現(xiàn):犧牲靈活性,存儲空間分配優(yōu)先考慮
    • 在堆(heap)的內(nèi)存池中動態(tài)的創(chuàng)建對象:保證靈活性,但直到運(yùn)行時才知道對象數(shù)量
    • Java采用動態(tài)內(nèi)存分配方式
  2. 對象的生命周期
    • java有垃圾回收器,因此能夠自動釋放對象占用的內(nèi)存
    • C++需要手動銷毀對象,不然可能導(dǎo)致內(nèi)存泄漏

1.11異常處理:處理錯誤

異常處理提供了一種從錯誤狀態(tài)進(jìn)行可靠恢復(fù)的途徑

1.12并發(fā)編程

  1. 線程:彼此獨立運(yùn)行的部分
  2. 并發(fā):多個線程同時運(yùn)行

1.13Java與Internet

1.13.1Web

  1. 服務(wù)器:信息存儲池、用于分發(fā)信息的軟件以及信息和軟件所駐留的機(jī)器或機(jī)群

1.13.2客戶端編程

  1. 通用網(wǎng)關(guān)接口(CGI):數(shù)據(jù)表單的提交通過CGI傳遞
  2. 插件(plug-in):下載一段代碼,插入到瀏覽器中適當(dāng)位置,來擴(kuò)展瀏覽器功能
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 抽象過程 所有編程語言都提供抽象機(jī)制。匯編語言是對機(jī)器語言的抽象,“命令式語言”(C、BASIC等)是對匯編語言的...
    海生2018閱讀 225評論 0 0
  • 運(yùn)行時類型信息使得你可以在程序運(yùn)行時發(fā)現(xiàn)和使用類型信息 為什么需要RTTI(Run-Time Type Ident...
    海生2018閱讀 363評論 1 0
  • 第一章 對象導(dǎo)論 1.1抽象過程 所有編程語言都是在提供對問題的抽象。匯編語言是對底層機(jī)器的抽象;命令式語言(如c...
    麥崎閱讀 398評論 0 0
  • Thinking in java 讀書筆記系列 運(yùn)行時類型信息使得你可以在程序運(yùn)行時發(fā)現(xiàn)和使用類型信息。Java ...
    下位子閱讀 366評論 3 2
  • Java 與其他語言的不同之處,是它在設(shè)計的時候就把目標(biāo)專注于克服開發(fā)與維護(hù)程序的復(fù)雜性。然而很多EE特性和亂七八...
    Perebor閱讀 323評論 0 1

友情鏈接更多精彩內(nèi)容