JAVA語言系列(一):對象


1. 抽象

人們所能夠解決的問題的復雜性取決于抽象的類型和質(zhì)量

抽象的類型是指所抽象的是什么

  • 匯編語言是對底層機器的輕微抽象
  • 命令式語言(BASIC,C)等解決問題是基于計算機的結(jié)構,是對匯編語言的抽象。
  • 只針對待解決問題建模,如LISP
  • 面向?qū)ο蟮姆绞?,根?jù)問題來描述問題,而不是根據(jù)運行解決方案的計算機來描述問題,如JAVA

面向?qū)ο蠓绞?/strong>:程序可以通過添加新類型的對象使自身適用于某個特定問題。編譯器像對待內(nèi)置類型一樣地對它們進行類型檢查。

  • 不會受限于任何特定的問題。
  • 將問題空間(如一項業(yè)務)中的元素及其在解空間(如計算機)中的表示稱為對象。程序設計的挑戰(zhàn)在于問題空間的元素和解空間的對象之間創(chuàng)建一對一的映射。
  • 對象有狀態(tài)(內(nèi)部數(shù)據(jù)),行為(方法)和標識(內(nèi)存中的唯一地址)。
  • 所有的對象都是唯一的,具有相同特性和行為的對象所屬同一個類型。
  • 類描述了具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象集合。

五個特性

  • 萬物皆對象
  • 程序是對象的集合,它們通過發(fā)消息來告知彼此要做的。
  • 每個對象都有自己的由其他對象所構成的存儲。
  • 每個對象都擁有其類型。
  • 某一個特定類型的所有對象都可以接收同樣的消息。

2. 對象

對象的接口:接口確定了對某一特定對象所能發(fā)出的請求。每個請求都有一個方法與之關聯(lián),向?qū)ο蟀l(fā)送請求時,與之關聯(lián)的方法就會被調(diào)用。
對象是服務提供者:程序向用戶提供服務,它通過調(diào)用其他對象提供的服務來實現(xiàn)這一目的。
對象的內(nèi)聚性:每個對象可以很好地完成一項任務,但是并不試圖做更多的事情。
訪問控制:為了讓客戶端程序員無法觸及他們不該觸及的部分。允許類創(chuàng)建者可以改變類內(nèi)部的工作方式而不擔心影響到客戶端程序員。
對象的創(chuàng)建:JAVA采用動態(tài)內(nèi)存分配,在堆中動態(tài)創(chuàng)建對象。存儲空間是動態(tài)管理,因此需要更多的時間用于分配存儲空間。
對象的回收:堆上的對象編譯器對于其生命周期一無所知,java的垃圾回收機制被用于處理內(nèi)存釋放問題。垃圾回收機制受益于JAVA的單根繼承和只能以一種方式創(chuàng)建對象這兩個特性。

代碼復用

  • 組合(has-a):直接將類的一個對象置于某個新類中。成員對象通常聲明為private,使得類創(chuàng)建者可以在不干擾現(xiàn)有客戶端代碼的情況下,修改這些成員??梢栽谶\行時修改這些成員對象,以實現(xiàn)動態(tài)修改程序的行為(spring中自動注入需要的對象)。
  • 聚合:如果組合是動態(tài)發(fā)生的,通常稱為聚合。
  • 繼承:使用基類型和導出類型表示類型之間的相似性。導出類型包括現(xiàn)有類型的所有成員(private被隱藏起來),具備相同的基礎接口。經(jīng)常把一個對象不當做它所屬的特定類型來對待,而是將其當做基類型來對待。

繼承

  • 基類與導出類之間的差異:可以直接通過添加新方法(應當考慮是否基類也需要這些方法);可以改變現(xiàn)有基類的方法(稱為覆蓋)
  • 純粹替代(is-a關系):導出類只覆蓋基類的方法,可以用一個導出類對象完全替代基類對象。
  • 擴展接口(is-like-a關系):導出類添加了新的接口元素,基類對新添加的接口一無所知。
  • 單根繼承:所有的類最終繼承自單一的基本類型Object,保證所有的對象都具備某些功能,所有的對象都能夠在堆上創(chuàng)建,參數(shù)傳遞也得到簡化,使得垃圾回收更加容易。

多態(tài)

  • 編譯器在編譯時并不能知道要處理的確切類型,會期望編譯結(jié)果是調(diào)用基類的版本,而多態(tài)保證了代碼能夠正確執(zhí)行導出類的版本。
  • 向上轉(zhuǎn)型:將導出類看做是基類的過程。
  • 前期綁定:編譯器產(chǎn)生一個具體函數(shù)名字的調(diào)用,而在運行時將這個調(diào)用解析到被執(zhí)行代碼的絕對地址。
  • 后期綁定:當向?qū)ο蟀l(fā)送消息時,被調(diào)用的代碼直到運行時才能確定,編譯器確保被調(diào)用方法的存在,并對調(diào)用參數(shù)和返回值執(zhí)行類型檢查(無法提供該保證的語言稱為弱類型,如python)。java使用一小段特殊的代碼來替代絕對地址調(diào)用,這段代碼使用在對象中存儲的信息來計算方法體的地址
  • c++中的virtual顯式聲明了后期綁定,java的動態(tài)綁定是默認行為。

容器:在任何時候都可以擴充自己以容納置于其中的所有對象

  • List用于存儲序列,Map用于建立對象間的關聯(lián),Set不含重復對象,以及隊列,樹,堆棧等。
  • 不同容器提供了不同的接口和外部行為。
  • 具有相同接口和外部行為的不同容器可能對于某些操作有不同的效率。如ArrayList和LinkedList,ArrayList擅長隨機訪問元素,LinkedList擅長插入元素??梢栽跇嫿〞r使用LinkedList,優(yōu)化系統(tǒng)性能使用LinkedList,List接口使得容器轉(zhuǎn)換更加容易。
  • 向下轉(zhuǎn)型:java 5之前,容器中存儲對象都是Object,使用時需要向下轉(zhuǎn)型,會進行運行時檢查。
  • 參數(shù)化類型機制(范型):編譯器可以自動定制作用于特定類型上的類,如定制一個直接納shape類型對象的容器。避免了向下轉(zhuǎn)型消除了犯錯誤的可能。

異常處理:將錯誤處理置于編程語言

  • 異常是一種對象,從錯誤地點被拋出,并被相應的異常處理器捕獲。
  • 異常處理與正常執(zhí)行路徑是并行的,不需要定期的檢查錯誤。
  • 異常不能被忽略,保證一定會在在某處得到處理。
  • 異常提供了一種從錯誤進行可靠回復的路徑。

其他注意

待更新

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

  • 抽象過程 所有編程語言都提供抽象機制。匯編語言是對機器語言的抽象,“命令式語言”(C、BASIC等)是對匯編語言的...
    海生2018閱讀 220評論 0 0
  • 面向?qū)ο缶幊蹋∣OP) Java是一個支持并發(fā)、基于類和面向?qū)ο蟮挠嬎銠C編程語言。下面列出了面向?qū)ο筌浖_發(fā)的優(yōu)點...
    hutuxiaogui閱讀 996評論 0 2
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,692評論 18 399
  • 上午面試2人,聯(lián)系廣告公司和電腦租用,下午面談電腦租用,廣告公司說聯(lián)系我下午都沒聯(lián)系,之前聯(lián)系的一家廣告公司量了尺...
    董銀超閱讀 120評論 0 0
  • 說起00后的愛情,突然就想到我們曾經(jīng),畢竟我們70后,80后,90后也是有過青春懵懂的時候,青春懵懂時期的愛情都是...
    家家有999本難念的經(jīng)閱讀 275評論 0 0

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