1. 程式人生 > >JAVA 思想

JAVA 思想

最簡 理解 color 允許 必須 真的 是什麽 會有 面向對象

訪問控制:

  一個原因是防止程序員接觸他們不該接觸的東西——通常是內部數據類型的設計思想。若只是為了解決特定的問題,用戶只需操作接口即可,毋需明白這些信息。

  第二個原因是允許庫設計人員修改內部結構,不用擔心它會對客戶程序員造成什麽影響。

繼承:

  我們費盡心思做出一種數據類型後,假如不得不又新建一種類型,令其實現大致相同的功能,那會是一件非常令人灰心的事情。但若能利用現成的數據類型,對其進行“克隆”,再根據情況進行添加和修改,情況就顯得理想多了。“繼承”正是針對這個目標而設計的。但繼承並不完全等價於克隆。在繼承過程中,若原始類(正式名稱叫作基礎類、超類或父類)發生了變化,修改過的“克隆”類(正式名稱叫作繼承類或者子類)也會反映出這種變化。在Java語言中,繼承是通過extends關鍵字實現的

  使用繼承時,相當於創建了一個新類。這個新類不僅包含了現有類型的所有成員,但更重要的是,它復制了基礎類的接口。也就是說,可向基礎類的對象發送的所有消息亦可原樣發給衍生類的對象。根據可以發送的消息,我們能知道類的類型。這意味著衍生類具有與基礎類相同的類型!為真正理解面向對象程序設計的含義,首先必須認識到這種類型的等價關系。
  由於基礎類和衍生類具有相同的接口,所以那個接口必須進行特殊的設計。也就是說,對象接收到一條特定的消息後,必須有一個“方法”能夠執行。若只是簡單地繼承一個類,並不做其他任何事情,來自基礎類接口的方法就會直接照搬到衍生類。這意味著衍生類的對象不僅有相同的類型,也有同樣的行為,這一後果通常是我們不願見到的。

  有兩種做法可將新得的衍生類與原來的基礎類區分開。第一種做法十分簡單:為衍生類添加新函數(功能)。這是一種最簡單、最基本的繼承用法。第二種方法是:改善基礎類,即類的重寫和多態。在C++中,這個關鍵字是virtual。在Java中,我們則完全不必記住添加一個關鍵字,因為函數的動態綁定是自動進行的。

對象的創建和存在時間:
  最重要的問題之一是對象的創建及破壞方式。對象需要的數據位於哪兒,如何控制對象的“存在時間”呢?針對這個問題,解決的方案是各異其趣的。C++認為程序的執行效率是最重要的一個問題,所以它允許程序員作出選擇。為獲得最快的運行速度,存儲以及存在時間可在編寫程序時決定,只需將對象放置在堆棧(有時也叫作自動或定域變量)或者靜態存儲區域即可。這樣便為存儲空間的分配和釋放提供了一個優先級。
  第二個方法是在一個內存池中動態創建對象,該內存池亦叫“堆”或者“內存堆”。若采用這種方式,除非進入運行期,否則根本不知道到底需要多少個對象,也不知道它們的存在時間有多長,以及準確的類型是什麽。由於存儲空間的管理是運行期間動態進行的,所以在內存堆裏分配存儲空間的時間比在堆棧裏創建的時間長得多。
C++允許我們決定是在寫程序時創建對象,還是在運行期間創建,這種控制方法更加靈活。程序員可用兩種方法來破壞一個對象:用程序化的方式決定何時破壞對象,或者利用由運行環境提供的一種“垃圾收集器”特性,自動尋找那些不再使用的對象,並將其清除。當然,垃圾收集器顯得方便得多,但出於效率未能包括到C++裏。但Java確實提供了一個垃圾收集器。

集合與繼承器:
  針對一個特定問題的解決,如果事先不知道需要多少個對象,或者它們的持續時間有多長,那麽也不知道如何保存那些對象。既然如此,怎樣才能知道那些對象要求多少空間呢?事先上根本無法提前知道,除非進入運行期。所以我們事先不必知道要在一個集合裏容下多少東西。只需創建一個集合,以後的工作讓它自己負責好了。在C++中,它們是以“標準模板庫”(STL)的形式提供的。而Java也用自己的標準庫提供了集合。

  所有集合都提供了相應的讀寫功能。

單根結構:
  在Java中(與其他幾乎所有OOP語言一樣),對這個問題的答案都是肯定的,而且這個終級基礎類的名字很簡單,就是一個“Object”。這種“單根結構”具有許多方面的優點。單根結構中的所有對象都有一個通用接口,所以它們最終都屬於相同的類型。

  另一種方案(就象C++那樣)是我們不能保證所有東西都屬於相同的基本類型。從向後兼容的角度看,這一方案可與C模型更好地配合,而且可以認為它的限制更少一些。但假期我們想進行純粹的面向對象編程,那麽必須構建自己的結構,以期獲得與內建到其他OOP語言裏的同樣的便利。需添加我們要用到的各種新類庫,還要使用另一些不兼容的接口。
  JAVA單根結構中的所有對象都可以保證擁有一些特定的功能。在自己的系統中,我們知道對每個對象都能進行一些基本操作。一個單根結構,加上所有對象都在內存堆中創建,可以極大簡化參數的傳遞(這在C++裏是一個復雜的概念)。
  利用單根結構,我們可以更方便地實現一個垃圾收集器。與此有關的必要支持可安裝於基礎類中,而垃圾收集器可將適當的消息發給系統內的任何對象。如果沒有這種單根結構,而且系統通過一個句柄來操縱對象,那麽實現垃圾收集器的途徑會有很大的不同,而且會面臨許多障礙。
  由於運行期的類型信息肯定存在於所有對象中,所以永遠不會遇到判斷不出一個對象的類型的情況。這對系統級的操作來說顯得特別重要,比如違例控制;而且也能在程序設計時獲得更大的靈活性。
既然你把好處說得這麽天花亂墜,為什麽C++沒有采用單根結構呢?事實上,這是早期在效率與控制上權衡的一種結果。單根結構會帶來程序設計上的一些限制。而且更重要的是,它加大了新程序與原有C代碼兼容的難度。盡管這些限制僅在特定的場合會真的造成問題,但為了獲得最大的靈活程度,C++最終決定放棄采用單根結構這一做法。而Java不存在上述的問題,它是全新設計的一種語言,不必與現有的語言保持所謂的“向後兼容”。所以很自然地,與其他大多數面向對象的程序設計語言一樣,單根結構在Java的設計方案中很快就落實下來。

JAVA 思想