java程式設計思想學習(1)
阿新 • • 發佈:2019-01-01
Smalltalk
這是第一種成功的面向物件程式設計語言,也是Java 的基礎語言。Smalltalk (java的基礎語言)的五大基本特徵: (1) 所有東西都是物件。可將物件想象成一種新型變數;它儲存著資料,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的元件,然後在程式中將其表達為一個物件。(2) 程式是一大堆物件的組合;通過訊息傳遞,各物件知道自己該做些什麼。為了向物件發出請求,需向那個物件“傳送一條訊息”。更具體地講,可將訊息想象為一個呼叫請求,它呼叫的是從屬於目標物件的一個子例程或函式。
(3) 每個物件都有自己的儲存空間,可容納其他物件。或者說,通過封裝現有物件,可製作出新型物件。所以,儘管物件的概念非常簡單,但在程式中卻可達到任意高的複雜程度。
(4) 每個物件都有一種型別。根據語法,每個物件都是某個“類”的一個“例項”。其中,“類”( Class)
是“型別”( Type)的同義詞。一個類最重要的特徵就是“能將什麼訊息發給它?”。
(5) 同一類所有物件都能接收相同的訊息。這實際是別有含義的一種說法,大家不久便能理解。由於型別為“圓”( Circle)的一個物件也屬於型別為“形狀”( Shape)的一個物件,所以一個圓完全能接收形狀訊息。這意味著可讓程式程式碼統一指揮“形狀”,令其自動控制所有符合“形狀”描述的物件,其中自然包括“圓”。這一特性稱為物件的“可替換性”,是OOP 最重要的概念之一。
介面
向物件發出的請求是通過它的“介面”( Interface)定義的,物件的“型別”或“類”則規定了它的介面形式。“型別”與“介面”的等價或對應關係是面向物件程式設計的基礎。介面”( Interface)規定了可對一個特定的物件發出哪些請求。 有兩方面的原因促使我們控制對成員的訪問。第一個原因是防止程式設計師接觸他們不該接觸的東西—— 通常是內部資料型別的設計思想。進行訪問控制的第二個原因是允許庫設計人員修改內部結構,不用擔心它會對客戶程式設計師造成什麼影響。例如,我們最開始可能設計了一個形式簡單的類,以便簡化開發。以後又決定進行改寫,使其更快地執行。若介面與實現方法早已隔離開,並分別受到保護,就可放心做到這一點,只要求使用者重新連結一下即可。“ public”(公共)意味著後續的定義任何人均可使用。“ private”(私有)意味著除了自己、型別的建立者以及那個型別的內部函式成員,其他任何人都不能訪問後續的定義資訊。 private 在您與客戶程式設計師之間豎起了一堵牆。若有人試圖訪問私有成員,就會得到一個編譯期錯誤。“ friendly ”(友好的)涉及“包裝”或“封裝”( Package)的概念——即 Java 用來構建庫的方法。若某樣東西是“友好的”,意味著它只能在這個包裝的範圍內使用(所以這一訪問級別有時也叫作“包裝訪問”)。“ protected”(受保護的)與“ private”相似,只是一個繼承的類可訪問受保護的成員,但不能訪問私有成員。
繼承
為重複使用一個類,最簡單的辦法是僅直接使用那個類的物件。但同時也能將那個類的一個物件置入一個新類。我們把這叫作“建立一個成員物件”。物件的組織具有極大的靈活性。新類的“成員物件”通常設為“私有”( Private),使用這個類的客戶程式設計師不能訪問它們。這樣一來,我們可在不干擾客戶程式碼的前提下,從容地修改那些成員。
繼承的意義:我們費盡心思做出一種資料型別後,假如不得不又新建一種型別,令其實現大致相同的功能,那會是一件非常令人灰心的事情。但若能利用現成的資料型別,對其進行“克隆”,再根據情況進行新增和修改,情況就顯得理想多了。“繼承”正是針對這個目標而設計的。
有兩種做法可將新得的衍生類與原來的基礎類區分開。第一種做法十分簡單:為衍生類新增新函式(功能)。這些新函式並非基礎類介面的一部分。進行這種處理時,一般都是意識到基礎類不能滿足我們的要求,所以需要新增更多的函式。這是一種最簡單、最基本的繼承用法,大多數時候都可完美地解決我們的問題。然而,事先還是要仔細調查自己的基礎類是否真的需要這些額外的函式。
繼承的等價與類似關係:但在許多時候,我們必須為衍生型別加入新的介面元素。所以不僅擴充套件了介面,也建立了一種新型別。這種新型別仍可替換成基礎型別,但這種替換並不是完美的,因為不可在基礎類裡訪問新函式。我們將其稱作“類似”關係;新型別擁有舊型別的介面,但也包含了其他函式,所以不能說它們是完全等價的。舉個例子來說,讓我們考慮一下製冷機的情況。假定我們的房間連好了用於製冷的各種控制器;也就是說,我們已擁有必要的“介面”來控制製冷。現在假設機器出了故障,我們把它換成一臺新型的冷、熱兩用空調,冬天和夏天均可使用。冷、 熱空調“類似”製冷機,但能做更多的事情。由於我們的房間只安裝了控制製冷的裝置,所以它們只限於同新機器的製冷部分打交道。新機器的介面已得到了擴充套件,但現有的系統並不知道除原始介面以外的任何東西。
把衍生型別當作它的基本型別處理的過程叫作“ Upcasting”(上溯造型)將一條訊息發給物件時,如果並不知道對方的具體型別是什麼,但採取的行動同樣是正確的,這種情況就叫作“多形性”( Polymorphism)。對面向物件的程式設計語言來說,它們用以實現多形性的方法叫作“動態繫結”。
抽象的基礎類和介面
設計程式時,我們經常都希望基礎類只為自己的衍生類提供一個介面。也就是說,我們不想其他任何人實際建立基礎類的一個物件,只對上溯造型成它,以便使用它們的介面。為達到這個目的,需要把那個類變成“抽象”的——使用 abstract 關鍵字。若有人試圖建立抽象類的一個物件,編譯器就會阻止他們。這種工具可有效強制實行一種特殊的設計。我們可以採用“引數化型別”,它們是編譯器能自動定製的類,可與特定的型別配合。
違例控制”將錯誤控制方案內建到程式設計語言中, 有時甚至內建到作業系統內。Java 的違例控制機制與大多數程式設計語言都有所不同。因為在Java 中,違例控制模組是從一開始就封裝好的,所以必須使用它!如果沒有自己寫一些程式碼來正確地控制違例,就會得到一條編譯期出錯提示。這樣可保證程式的連貫性,使錯誤控制變得更加容易。注意違例控制並不屬於一種面向物件的特性,儘管在面向物件的程式設計語言中, 違例通常是用一個物件表示的。早在面嚮物件語言問世以前,違例控制就已經存在了。
單根結構
在面向物件的程式設計中,由於 C++的引入而顯得尤為突出的一個問題是:所有類最終是否都應從單獨一個基礎類繼承。在Java 中(與其他幾乎所有 OOP 語言一樣),對這個問題的答案都是肯定的,而且這個終級基礎類的名字很簡單,就是一個“ Object”。這種“單根結構”具有許多方面的優點。單根結構中的所有物件都有一個通用介面,所以它們最終都屬於相同的型別。另一種方案(就象 C++那樣)
是我們不能保證所有東西都屬於相同的基本型別。
執行緒
執行緒:有些時候,中斷對那些實時性很強的任務來說是很有必要的。但還存在其他許多問題,它們只要求將問題劃分進入獨立執行的程式片斷中,使整個程式能更迅速地響應使用者的請求。在一個程式中,這些獨立執行的片斷叫作“執行緒”( Thread),利用它程式設計的概念就叫作“多執行緒處理”。Java 的多執行緒機制已內建到語言中,這使一個可能較複雜的問題變得簡單起來。對多執行緒處理的支援是在物件這一級支援的,所以一個執行執行緒可表達為一個物件。 Java 也提供了有限的資源鎖定方案。它能鎖定任何物件佔用的記憶體(記憶體實際是多種共享資源的一種),所以同一時間只能有一個執行緒使用特定的記憶體空間。為達到這個目的,需要使用 synchronized 關鍵字。其他型別的資源必須由程式設計師明確鎖定,這通常要求程式設計師建立一個物件,用它代表一把鎖,所有執行緒在訪問那個資源時都必須檢查這把鎖。
客戶機/伺服器計算
客戶機/伺服器系統的基本思想是我們能在一個統一的地方集中存放資訊資源。一般將資料集中儲存在某個資料庫中,根據其他人或者機器的請求將資訊投遞給對方。客戶機/伺服器概述的一個關鍵在於資訊是“集中存放”的。所以我們能方便地更改資訊,然後將修改過的資訊發放給資訊的消費者。將各種元素集中到一起,資訊倉庫、用於投遞資訊的軟體以及資訊及軟體所在的那臺機器,它們聯合起來便叫作“伺服器”( Server)。而對那些駐留在遠端機器上的軟體,它們需要與伺服器通訊,取回資訊,進行適當的處理,然後在遠端機器上顯示出來,這些就叫作“客戶” ( Client)。事務處理:要注意的一個主要問題是單個伺服器需要同時向多個客戶提供服務。在這一機制中,通常少不了一套資料庫管理系統,使設計人員能將資料佈局封裝到表格中,以獲得最優的使用。除此以外,系統經常允許客戶將新資訊插入一個伺服器。這意味著必須確保客戶的新資料不會與其他客戶的新資料衝突,或者說需要保證那些資料在加入資料庫的時候不會丟失(用資料庫的術語
來說,這叫作“事務處理”)。
中介軟體:對多種型別的計算機和作業系統的支援也是一個大問題。最後,效能的問題顯得尤為重要:可能會有數百個客戶同時向伺服器發出請求。所以任何微小的延誤都是不能忽視的。為儘可能緩解潛伏的問題,程式設計師需要謹慎地分散任務的處理負擔。一般可以考慮讓客戶機負擔部分處理任務,但有時亦可分派給伺服器所在地的其他機器,那些機器亦叫作“中介軟體”(中介軟體也用於改進對系統的維護)。
外掛
朝客戶端程式設計邁進的時候,最重要的一個問題就是外掛的設計。利用外掛,程式設計師可以方便地為瀏覽器新增新功能,使用者只需下載一些程式碼,把它們“插入”瀏覽器的適當位置即可。這些程式碼的作用是告訴瀏覽器“從現在開始,你可以進行這些新活動了”(僅需下載這些插入一次)。有些快速和功能強大的行為是通過外掛新增到瀏覽器的。但外掛的編寫並不是一件簡單的任務。在我們構建一個特定的站點時,可能並不希望涉及這方面的工作。對客戶端程式設計來說,外掛的價值在於它允許專業程式設計師設計出一種新的語言,並將那種語言新增到瀏覽器,同時不必經過瀏覽器原創者的許可。由此可以看出,外掛實際是瀏覽器的一個“後門”,允許建立新的客戶端程式設計語言(儘管並非所有語言都是作為外掛實現的)。Activex
在某種程度上, Java 的一個有力競爭對手應該是微軟的 ActiveX,儘管它採用的是完全不同的一套實現機制。 ActiveX 最早是一種純 Windows 的方案。經過一家獨立的專業協會的努力, ActiveX 現在已具備了跨平臺使用的能力。實際上, ActiveX 的意思是“假如你的程式同它的工作環境正常連線,它就能進入 Web 頁,並在支援 ActiveX 的瀏覽器中執行”( IE 固化了對 ActiveX 的支援,而 Netscape 需要一個外掛)。所以,ActiveX 並沒有限制我們使用一種特定的語言。比如,假設我們已經是一名有經驗的 Windows 程式設計師,能熟練地使用象 C++、 Visual Basic 或者 BorlandDelphi 那樣的語言,就能幾乎不加任何學習地創建出 ActiveX元件。事實上, ActiveX 是在我們的 Web 頁中使用“歷史遺留”程式碼的最佳途徑。