java基礎-對象導論

    最近重新拿起《Java編程思想》這本書,想起好久沒有寫過博客了,趁着自己想學習,重新開寫吧!

    1.抽象過程:所有編程語言都提供抽象機制,人們能夠解決問題的複雜性直接取決於抽象的類型和質量。

    2.java的五個基本特性:

        (1)萬物皆是對象;

        (2)程序是對象的集合(容器),他們通過發送消息來告訴彼此所要做的;

        (3)每個對象都有自己的由其他對象所構成的存儲;

        (4)每個對象都擁有起類型;

        (5)每個特定類型的所有對象都可以接收同樣的消息。

    3.每個對象都有一個接口:

        一個類就是一個數據類型;每個對象都只能滿足某些請求,這些請求由對象的接口定義,決定接口的便是類型。

    4.每個對象都提供服務。

    5.被隱藏的具體實現:

        Java用三個關鍵字在累的內部設定邊界:public、private、protected。

        public:表示緊隨氣候的元素對任何人都是可用的。

        private:標識除類型創建者和類型的內部方法之外的任何人都不能訪問的元素。

        protected:與private相當,差別在於繼承的類可以訪問protected成員,不能訪問private成員。

    6.複用具體實現:

        最簡單的複用某個類的方式就是直接試用該類的一個對象,也可以將那個類的一個對象置於某個新的類中。這就是創建一個成員對象,新的類可以由任意數量、任意類型的其他對象以任何可以實現新的類中想要的功能的方式所組成,這就是組合。組合帶來的極大的靈活性。

    7.繼承:

        當繼承現有類型時,也就創建了新的類。

        子類和父類具有相同的類型。

        如果我們只是繼承了父類,在父類中只重寫方法而不創建新的方法,我們可以稱之爲純粹替代(代替原則)。有時必須在子類中添加新的接口元素,這樣就擴展了接口,這個新的類型仍然可以代替基類,但是不完美,基類無法訪問新添加的方法。

    8.伴隨多態的可互換對象:

        在處理類型的層次結構時,經常想把一個對象不當作它所屬的特定類型來對待,而是將其當作基類的對象來對待。這使得人們可以編寫出不依賴於特定類型的代碼。

        但是,在試圖將導出類型的對象當作其泛化基類型對象來看待時(把圓形看作是幾何形,把自行車看作是交通工具),仍然存在一個問題。如果某個方法要讓泛化幾何形狀繪製自己、讓泛化交通工具行駛,或者讓泛化的鳥類移動,那麼編譯器在編譯時是不可能知道應該執行哪一段代碼的。這就是關鍵所在:當發送這樣的消息時,程序員並不想知道哪一段代碼將被執行;繪圖方法可以被等同地應用於圓形、正文形、三角形,而對象會依據自身的具體類型來執行恰當的代碼。

        OOP中,程序直到運行時才能確定代碼的地址,所以當消息發送到一個泛化對象時,必須採用其他機制。

        爲了解決這個問題,面向對象程序設計語言使用了後期綁定的概念。當向對象發送消息時,被調用的代碼直到運行時才能確定。編譯器確保被調用方法的存在,並對調用參數和返回值執行類型檢查(無法提供此類保證的語言被稱爲是弱類型的),但是並不知道將被執行的確切代碼。

        爲了執行後期綁定,Java使用一小段特殊的代碼來替代絕對地址調用。這段代碼使用在對象中存儲的信息來計算方法體的地址。這樣,根據這一小段代碼的內容,每一個對象都可以具有不同的行爲表現。當向一個對象發送消息時,該對象就能夠知道對這條消息應該做些什麼。

        而在Java中,動態綁定是默認行爲,不需要添加額外的關鍵字來實現多態。

        把將導出類看做是它的基類的過程稱爲向上轉型(upcasting)。

        轉型(cast)這個名稱的靈感來自於模型鑄造的塑模動作,而向上(up)這個詞來源於繼承圖的典型佈局方式,通常基類在頂部,而導出類在其下部散開。因此,轉型爲一個基類就是在繼承圖中向上移動,即“向上轉型”。

    9.單根繼承結構:

        在java中,所有的類最終都繼承於單一的基類,這個基類就是Object。事實證明,單根繼承結構帶來了很多好處。單根繼承使得垃圾回收器的實現變得容易的多。由於所有對象都保證具有其類型信息,因此不會因無法確定對象的類型而陷入僵局。

    10.容器:

        如果不知道在解決某個特定問題時需要多少個對象,或者它們將存活多久,那麼就不可能知道如何存儲這些對象。如何才能知道需要多少空間來創建這些對象呢?答案是你不可能知道,因爲這類信息只有在運行時才能獲得。

        Java解決方案:創建另一種對象類型。這種新的對象類型持有對其它對象的引用。

        這個對象類型通常被稱爲容器(也稱爲集合),這個新的對象可以在任何需要的時候擴充自己以容納放置在其中的所有東西。因此不需要知道將來會有多少個對象置於容器中,只需要創建一個容器對象,然後讓它處理所有細節。

        從設計的觀點來看,真正需要的只是一個可以被操作,從而解決問題的序列。

        如果單一類型的容器可以滿足所有需求,那麼就沒有理由設計不同種類的序列了。

        然而還是需要對容器有所選擇,這裏有兩個原因:不同容器提供了不同類型的接口和外部行爲;不同容器對於某些操作具有不同的效率。

    11.對象的創建和生命週期:

        在被稱爲堆(heap)的內存池中動態地創建對象。運行時才知道需要多少對象,它們的生命週期如何,以及它們的具體類型是什麼。

        如果需要一個新對象,可以在需要的時刻直接在堆中創建。因爲存儲空間是在運行時被動態管理的,所以需要大量的時間在堆中分配存儲空間,這可能要遠遠大於堆棧中創建存儲空間的時間。

    12.異常處理:

        java一開始就內置了異常處理,而且強制你必須使用它。

    13.併發編程:

        在計算機編程中有一個概念,就是在同一時刻處理多個任務的思想。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章