?? chapter1.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Thinking in Java | Chinese Version by Trans Bot</title>
<meta name="Microsoft Theme" content="inmotion 111, default"></head>
<body background="../_themes/inmotion/inmtextb.gif" tppabs="http://member.netease.com/%7etransbot/Thinking%20in%20Java/_themes/inmotion/inmtextb.gif" bgcolor="#FFFFCC" text="#000000" link="#800000" vlink="#996633" alink="#FF3399">
<p>第1章 對象入門<br>
<br>
“為什么面向對象的編程會在軟件開發領域造成如此震憾的影響?”<br>
<br>
面向對象編程(OOP)具有多方面的吸引力。對管理人員,它實現了更快和更廉價的開發與維護過程。對分析與設計人員,建模處理變得更加簡單,能生成清晰、易于維護的設計方案。對程序員,對象模型顯得如此高雅和淺顯。此外,面向對象工具以及庫的巨大威力使編程成為一項更使人愉悅的任務。每個人都可從中獲益,至少表面如此。<br>
如果說它有缺點,那就是掌握它需付出的代價。思考對象的時候,需要采用形象思維,而不是程序化的思維。與程序化設計相比,對象的設計過程更具挑戰性——特別是在嘗試創建可重復使用(可再生)的對象時。過去,那些初涉面向對象編程領域的人都必須進行一項令人痛苦的選擇:<br>
(1) 選擇一種諸如Smalltalk的語言,“出師”前必須掌握一個巨型的庫。<br>
(2) 選擇幾乎根本沒有庫的C++(注釋①),然后深入學習這種語言,直至能自行編寫對象庫。<br>
<br>
①:幸運的是,這一情況已有明顯改觀。現在有第三方庫以及標準的C++庫供選用。<br>
<br>
事實上,很難很好地設計出對象——從而很難設計好任何東西。因此,只有數量相當少的“專家”能設計出最好的對象,然后讓其他人享用。對于成功的OOP語言,它們不僅集成了這種語言的語法以及一個編譯程序(編譯器),而且還有一個成功的開發環境,其中包含設計優良、易于使用的庫。所以,大多數程序員的首要任務就是用現有的對象解決自己的應用問題。本章的目標就是向大家揭示出面向對象編程的概念,并證明它有多么簡單。<br>
本章將向大家解釋Java的多項設計思想,并從概念上解釋面向對象的程序設計。但要注意在閱讀完本章后,并不能立即編寫出全功能的Java程序。所有詳細的說明和示例會在本書的其他章節慢慢道來。<br>
<br>
1.1 抽象的進步<br>
所有編程語言的最終目的都是提供一種“抽象”方法。一種較有爭議的說法是:解決問題的復雜程度直接取決于抽象的種類及質量。這兒的“種類”是指準備對什么進行“抽象”?匯編語言是對基礎機器的少量抽象。后來的許多“命令式”語言(如FORTRAN,BASIC和C)是對匯編語言的一種抽象。與匯編語言相比,這些語言已有了長足的進步,但它們的抽象原理依然要求我們著重考慮計算機的結構,而非考慮問題本身的結構。在機器模型(位于“方案空間”)與實際解決的問題模型(位于“問題空間”)之間,程序員必須建立起一種聯系。這個過程要求人們付出較大的精力,而且由于它脫離了編程語言本身的范圍,造成程序代碼很難編寫,而且要花較大的代價進行維護。由此造成的副作用便是一門完善的“編程方法”學科。<br>
為機器建模的另一個方法是為要解決的問題制作模型。對一些早期語言來說,如LISP和APL,它們的做法是“從不同的角度觀察世界”——“所有問題都歸納為列表”或“所有問題都歸納為算法”。PROLOG則將所有問題都歸納為決策鏈。對于這些語言,我們認為它們一部分是面向基于“強制”的編程,另一部分則是專為處理圖形符號設計的。每種方法都有自己特殊的用途,適合解決某一類的問題。但只要超出了它們力所能及的范圍,就會顯得非常笨拙。<br>
面向對象的程序設計在此基礎上則跨出了一大步,程序員可利用一些工具表達問題空間內的元素。由于這種表達非常普遍,所以不必受限于特定類型的問題。我們將問題空間中的元素以及它們在方案空間的表示物稱作“對象”(Object)。當然,還有一些在問題空間沒有對應體的其他對象。通過添加新的對象類型,程序可進行靈活的調整,以便與特定的問題配合。所以在閱讀方案的描述代碼時,會讀到對問題進行表達的話語。與我們以前見過的相比,這無疑是一種更加靈活、更加強大的語言抽象方法。總之,OOP允許我們根據問題來描述問題,而不是根據方案。然而,仍有一個聯系途徑回到計算機。每個對象都類似一臺小計算機;它們有自己的狀態,而且可要求它們進行特定的操作。與現實世界的“對象”或者“物體”相比,編程“對象”與它們也存在共通的地方:它們都有自己的特征和行為。</p>
<p>Alan Kay總結了Smalltalk的五大基本特征。這是第一種成功的面向對象程序設計語言,也是Java的基礎語言。通過這些特征,我們可理解“純粹”的面向對象程序設計方法是什么樣的:</p>
<p>(1)
所有東西都是對象。可將對象想象成一種新型變量;它保存著數據,但可要求它對自身進行操作。理論上講,可從要解決的問題身上提出所有概念性的組件,然后在程序中將其表達為一個對象。<br>
(2)
程序是一大堆對象的組合;通過消息傳遞,各對象知道自己該做些什么。為了向對象發出請求,需向那個對象“發送一條消息”。更具體地講,可將消息想象為一個調用請求,它調用的是從屬于目標對象的一個子例程或函數。<br>
(3)
每個對象都有自己的存儲空間,可容納其他對象。或者說,通過封裝現有對象,可制作出新型對象。所以,盡管對象的概念非常簡單,但在程序中卻可達到任意高的復雜程度。<br>
(4)
每個對象都有一種類型。根據語法,每個對象都是某個“類”的一個“實例”。其中,“類”(Class)是“類型”(Type)的同義詞。一個類最重要的特征就是“能將什么消息發給它?”。<br>
(5)
同一類所有對象都能接收相同的消息。這實際是別有含義的一種說法,大家不久便能理解。由于類型為“圓”(Circle)的一個對象也屬于類型為“形狀”(Shape)的一個對象,所以一個圓完全能接收形狀消息。這意味著可讓程序代碼統一指揮“形狀”,令其自動控制所有符合“形狀”描述的對象,其中自然包括“圓”。這一特性稱為對象的“可替換性”,是OOP最重要的概念之一。<br>
<br>
一些語言設計者認為面向對象的程序設計本身并不足以方便解決所有形式的程序問題,提倡將不同的方法組合成“多形程序設計語言”(注釋②)。<br>
<br>
②:參見Timothy Budd編著的《Multiparadigm Programming in Leda》,Addison-Wesley
1995年出版。<br>
<br>
1.2 對象的接口<br>
亞里士多德或許是認真研究“類型”概念的第一人,他曾談及“魚類和鳥類”的問題。在世界首例面向對象語言Simula-67中,第一次用到了這樣的一個概念:<br>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -