一、對象導論(二)

   本章第6和第7部分講的分別是繼承和多態,後面會有兩大章節詳細描述,因此暫時跳過這兩部分繼續往下學習。

8、單根繼承結構

Java中的單根集成結構是指在Java中,所有的類最終都繼承自單一的基類——Object。事實證明,單根繼承結構帶來了很多好處。由於樹中描述的遠比我自己組織的語言好,所以以下兩段內容部分摘抄了原話。

單根繼承結構中的所有對象都有一個共用接口,所以它們歸根結底都是相同的基本類型,而C++無法保證這一點。單根繼承結構保證所有對象都具備某些功能,因此在系統中我們可以在每個對象上都能執行一些基本操作,所有的對象都可以很容易地在堆上創建,而參數傳遞也得到了極大的簡化。

單根繼承結構使垃圾回收變得容易得多,而垃圾回收器正是Java相對C++的重要改進之一。由於所有對象都保證具有其類型信息,因此不會因無法確定對象的類型而陷入僵局。這對於系統級操作(如異常處理)顯得尤其重要,並且給編程帶來了更大的靈活性。

9、容器

提到容器,大家容易想到Tomcat,事實上,這裏的容器指的是能夠容納多個相同類型的對象的一種特殊的對象,這個容器在任何時候都能夠擴充自己以容納我們想要放入的對象。因此當我們不知道將來需要存放多少個對象的時候,只需要創建一個容器,將對象都放到容器裏,然後讓容器處理細節就好。
說了這麼多,其實所謂的容器,在Java裏就是大家耳熟能詳的List、Map、Set,以及由它們互相配合形成的新的容器,如隊列、樹、棧等等。容器的種類如此之多,僅僅List接口的實現類就有十幾種之多(平時常用的無外乎ArrayList和LinkedList),JDK爲我們提供這麼多選擇是有原因的
這裏寫圖片描述

  • 首先,不同容器提供了不同類型的接口和外部行爲。例如堆棧的先進後出與隊列的先入先出、List的有序性和Set的無序性等等,其內部機制不同導致了外部行爲的差異性。
  • 其次,不同容器對於某些操作具有不同的效率。一個最經典的例子就是ArrayList和LinkedList的比較,兩者雖然同實現了List接口,對外接口和行爲是一致的,但是在一些操作的效率上確實天壤之別。在隨機訪問效率方面,ArrayList比較高效,能夠在O(1)內訪問到任何位置的元素,而LinkedList則爲O(n);在中間增刪元素方面,LinkedList能夠在O(1)內完成,而ArrayList則需要O(n)。

    因此我們在開發的時候應該注意區別不同容器的特性,使用最合適的容器來容納對象們,以追求最高效率。

9.1 參數化類型

前面我們提到過容器中存的都是一些對象,但是究竟是什麼類型的對象還未可知,在Java 5之前,程序員需要記住裏面放了什麼類型的東西,因爲那個年代,只要是個Object就能往裏放,而Java中所有對象都是Object,結果可想而知,前面定義了一個容器,後面使用的時候卻不記得裏面放的什麼類型,還需要回到前面去看一下,以免發生類型轉化錯誤。

Java 5的重大變化之一就是增加了參數化類型,我們稱之爲“泛型”,例如我們可以使用下面這樣的語句來創建一個存儲Shape的ArrayList:

ArrayList<Shape> shapes = new ArrayList<Shape>();

這樣在shapes這個List中,我們就只能放Shape類型的對象了,減輕了程序員負擔,也消除了犯錯的可能性。

發佈了30 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章