1. 程式人生 > >Java編程思想 學習筆記1

Java編程思想 學習筆記1

clas 回收 面向對象設計 抽象 類對象 獨立 nbsp 直接 設計者

一、對象導論

1.抽象過程
  Alan Kay曾經總結了第一個成功的面向對象語言、同時也是Java所基於的語言之一的Smalltalk的五個基本特性,這些特性表現了純粹的面向對象程序設計方式
  1)萬物皆對象
  2)程序是對象的集合,它們通過發送消息來告知彼此所要做的。要想請求一個對象,就必須對該對象發送一條消息。更具體的說,可以把消息想象為對某個特定對象的方法的調用請求。
  3)每個對象都有自己的由其他對象所構成的存儲。換句話說,可以通過創建包含現有對象的包的方式來創建新類型的對象。
  4)每個對象都擁有其類型。按照通用的說法,“每個對象都是某個類(class)

的一個實例(instance)”。每個類最重要的區別於其他類的特性就是“可以發送什麽樣的消息給它”。
  5)某一特定類型的所有對象都可以接收同樣的消息

2.每個對象都有一個接口
  所有對象都是唯一的,但同時也是具有相同的特性和行為的對象所屬類的一部分。
  每個對象都只能滿足某些請求,這些請求由對象的接口(interface)所定義。接口確定了對某一特定對象所能發出的請求。但是,程序中必須有滿足這些請求的代碼。這些代碼和隱藏的數據一起構成了實現

3.每個對象都提供服務

  將對象想象成是”服務提供者“

。這樣做的好處之一:有助於提高對象的內聚性。高內聚是軟件設計的基本質量要求之一:這意味著一個軟件構件的各個方面”組合“的很好。

  我們經常遇到的問題是,將過多的功能都塞在一個對象裏。在良好的面向對象設計中,每個對象都可以很好地完成一項任務,但是它並不試圖做更多的事。

4.被隱藏的具體實現

 將程序開發人員按照角色分為**類創建者**和**客戶端程序員**。客戶端程序員的目標是收集各種用來實現快速應用開發的類。類創建者的目標是創建類,這種類只向客戶端程序員暴露必需的部分,而隱藏其他部分。

訪問控制的第一個存在原因就是讓客戶端程序員無法觸及他們不應該觸及的部分,讓他們清晰地應用服務;第二個原因就是允許庫設計者可以改變類內部的工作方式而不用擔心影響到客戶端程序員。


5.復用具體實現
  組合:使用現有的類合成新的類,經常被視為”has-a”關系。
  創建新類時優先選擇組合。

6.繼承

  可以創建一個基類型來表示系統中某些對象的核心概念,從基類型中導出其他類型,來表示此核心可以被實現的各種不同方式。
  所有可以發送給基類對象的消息同時也可以發送給導出類對象。由於通過發送給類的消息的類型可知類的類型,所以這也就意味著導出類與基類具有相同的類型
  有兩種方法可以使基類與導出類產生差異。第一種:直接在導出類中添加新方法。這意味著基類不能滿足你的所有需求,因此必須添加新方法;第二種是改變基類的方法,即覆蓋(override)
  “是一個”與“像是一個”關系
  is-a:繼承只覆蓋基類的方法,結果可以用一個導出類對象來完全替代一個基類對象。被視為純粹替代。
  has-a:新類型具有舊類型的接口,但還包含其他方法,基類無法訪問新添加的方法。

7.伴隨多態的可互換對象
  在處理類型的層次結構時,通常想把一個對象不當作它所屬的特定類型來對待,而是將其當作其基類的對象來對待。這樣我們能編寫出不依賴特定類型的代碼。
  一個非面向對象編程的編譯器產生的函數調用會引起所謂的前期綁定,這意味著編譯器將產生對一個具體函數名字的調用,而運行時將這個調用解析到將被執行的代碼的絕對地址。
  面向對象程序設計語言使用了後期綁定的概念。當對象發送消息時,被調用的代碼直到運行時才能確定。編譯器確保被調用方法的存在,並對調用參數和返回值執行類型檢查,但是並不知道將被執行的確切代碼。為了執行後期綁定,Java使用一小段特殊的代碼來代替絕對地址調用。這段代碼使用在對象存儲的信息來計算方法體的地址。這樣,根據這一小段代碼的內容,每一個對象都可以具有不同的行為表現。當向一個對象發送消息時,該對象就能夠知道這條消息應該做些什麽。
  把導出類看做是它的基類的過程稱為向上轉型

8.單根繼承結構
  所有類都繼承自Object。
  單根繼承結構保證所有對象都具備某些功能。
  單根繼承結構使垃圾回收器的實現變得容易得多。

9.容器
  存儲不定數量的對象。
  參數化類型
  Java SE5之前,容器存儲的對象都只具有Java中的通用類型:Object。因為Object可以存儲一切東西。但這種做法在涉及具體應用時則很危險,因為向下轉型是不安全的,程序員需要花更多精力來處理正確的轉型。
  參數化類型機制則可以解決此問題。參數化類型就是一個在編譯中可以自動定制作用於特定類型上的類。稱之為範型。

10.對象的創建和生命期
  怎樣才能知道何時銷毀這些對象?當處理完某個對象之後,系統某個部分可能還在處理它。
  對象的數據位於何處?怎樣控制對象的生命周期?這裏有兩種方式:

  • 第一種是追求效率,對象的存儲空間和生命周期可以在編寫程序時確定,通過將對象置於堆棧(它們有時被稱為自動變量或限域變量)或靜態存儲區域內來實現。
  • 第二種是在被稱為堆的內存池中動態地創建對象。這樣,直到運行時才知道需要多少對象、生命周期以及具體類型。

  因為存儲空間是在運行時被動態管理的,所有需要大量的時間在堆中分配存儲空間,這可能要遠遠大於在堆棧中創建存儲空間的時間。在堆棧中創建存儲空間和釋放空間通常各需要一條匯編指令即可,分別對應將棧頂指針向下移動和將棧頂指針向上移動。創建堆存儲空間的時間依賴於存儲機制的設計。

  動態方式有這樣一個一般性的邏輯假設:對象趨向於變得復雜,所以查找和釋放存儲空間的開銷不會對對象的創建造成重大沖擊。
  Java完全采用了動態內存分配方式。每當想要創建新對象時,就要使用new關鍵字來構建此對象的動態實例。
  對於允許在堆棧上創建對象的語言,編譯器可以確定對象的存活時間,並可以自動銷毀它。然而,如果是在堆上創建對象,編譯器就會對它的生命周期一無所知。因此,Java提供了被稱為“垃圾回收器”的機制,它可以自動發現對象何時不再被使用,並繼而銷毀它。

11.異常處理:處理錯誤
  大多數錯誤處理機制的主要問題在於,它們都依賴於程序員自身的警惕性,這種警惕性來源於一種共同的約定,而不是編程語言所強制的。
  異常處理直接把錯誤處理直接置於編程語言中,有時甚至置於操作系統中。
  註意,異常處理並不是面向對象語言的特征。

12.並發編程
  在計算機編程中有一個基本概念,就是在同一時刻處理多個任務的思想。許多程序設計問題都要求,程序能夠停下正在做的工作,轉而處理某個其他問題,然後再返回主進程。
  我們只需把任務切分成多個可獨立運行的部分,從而提高程序的響應能力。在程序中,這些彼此獨立運行的部分稱之為線程,上述概念被稱為“並發”。
  但有一個隱患:共享資源。如果有多個並行任務都要訪問同一項資源,那麽就會出問題。解決問題的方法是:某個任務鎖定某項資源,完成其任務,然後釋放資源,使其他任務可以使用這項資源。

13.Java與Internet
待補。。。。看不懂

14.總結

  Java程序中只包含以下兩部分內容:用來表示問題空間概念的對象(而不是有關計算機表示方式的相關內容),以及發送給這些對象的用來表示在此空間內的行為的消息

  這一章的內容很廣泛,還需要全面學習之後再回來總體把握精髓。

Java編程思想 學習筆記1