全部編程語言都提供抽象機制,人們所能解決的問題的複雜性直接取決於抽象的類型和質量。程序員
OOP 容許根據問題來描述問題,而不是根據運行解決方案的計算機來描述問題。編程
對象具備狀態、行爲和標識編程語言
全部的對象都是惟一的,但同時也是具備相同特性和行爲的對象所歸屬的類的一部分。設計
類描述了具備相同特性(數據元素)和行爲(功能)的對象集合,因此一個類實際上就是一個數據類型。code
面向對象程序設計的挑戰之一,就是在問題空間的元素和解空間的對象之間建立一對一的映射。對象
每一個對象都只能知足某些請求,這些請求由對象的接口(interface)所定義,決定接口的即是類型。blog
接口肯定了某一個特定對象所能發出的請求,可是,在程序中必須有知足這些請求的代碼,這些代碼與隱藏的數據一塊兒構成了實現(implement)繼承
當正在試圖開發或理解一個程序設計,最好的方法之一就是將對象想象成「服務提供者」接口
高內聚是軟件設計的基本質量要求之一:這意味着一個軟件構件的各個方面「組合的好」內存
將程序開發人員按照角色分爲類建立者和客戶端程序員:
將實現隱藏起來能夠減小程序的 bug,即訪問控制,訪問控制存在的緣由:
Java 中的四種訪問權限:
public
:任何人都是可用的private
:除了類型建立者和類型的內部方法以外任何人都不能訪問protected
:與 private
相似,差異在與繼承於該類的派生類能夠訪問protected
成員default
:包訪問權限,同一個包中其餘類能夠訪問。代碼複用是面向對象程序設計語言所提供的最了不得的優勢之一
組合(「has-a」關係):新的類能夠由任意數量、類型的其餘對象以任意能夠實現新的類中想要的功能的方式組成。若是組合是動態發生的,那麼它一般被稱爲「聚合」
*在創建新類時,應該首先考慮組合,而不是繼承,由於它更加簡單靈活。
兩個類型能夠有相同的特性和行爲,可是其中一個類型可能比另外一個含有更多的特性。繼承使用基類型和派生類型的概念表示了這種類型之間的類似性。
一個基類型包含全部派生類所共享的特性和行爲,能夠建立一個基類型來表示系統中某些對象的核心概念,從基類型中派生出其餘類型,來表示該核心能夠被不一樣的方式實現。
經過繼承而產生的類型等價性是理解面向對象程序設計方法內涵的重要門檻。
基類與派生類的類似性:全部能夠發送給基類對象的消息同時也能夠發送給派生類對象。 產生基類與派生類的差別性的兩種形式:
在處理類型的層次結構時,把一個對象不當作它所屬的特性類型來對待,而是將其當作其基類的對象來對待,這一能夠編寫出不依賴於特定類型的代碼。
爲了實現泛型,面向對象程序設計語言使用了後期綁定的概念,當向對象發送消息時,被調用的代碼直到運行時才能肯定。編譯器確保被調用方法的存在,並對調用參數和返回值執行類型檢查,可是並不知道將被執行的確切代碼。
Java 使用了一小段特殊的代碼來代替絕對地址調用。
在某些語言中(如C++),必須明確聲明但願某個方法具有後期綁定,而 Java 中,動態綁定是默認行爲,不須要額外添加關鍵字來實現多態。
全部的類都最終繼承自單一的基類,Java 中 這個類爲
Object
。
在單根繼承結構中的全部對象都具備一個公用接口,因此它們歸根到底都是相同的基本類型。
單根繼承結構使得垃圾回收的實現變得容易得多。
容器是經過向下轉型實現的,容器知道元素轉型前的類型,則能夠實現容器,這種解決方法即參數化類型,即泛型。
new
關鍵字來構建此對象的動態實例。大多數錯誤機制的主要問題在於,它們都依賴於程序員自身的警戒性,這種警戒性來源於一種共同的約定,而不是編程語言所強制的。這種機制容易被忽視。
被拋出的異常不像方法返回的錯誤值和方法設置的用來表示錯誤條件的標誌位那樣能夠被忽略。異常不能被忽視,因此它保證必定會在某處獲得處理。
異常處理不是面向對象的特性。
本文首發於Code & Fun