对象导论---JAVA编程思想
第一章 對象導(dǎo)論
序言
“我們之所以將自然界分解,組織成各種概念,并按其含義分類,主要是因為我們是整個口語交流社會共同遵守的協(xié)定的參與者,這個協(xié)定以語言的形式固定下來…除非贊成這個協(xié)定中規(guī)定的有關(guān)語言信息的組織和分類,否則我們根本無法交談。”出自于Benjamin Lee Whorf(1897~1941)之口。
計算機(jī)革命起源于機(jī)器,因此,編程語言的產(chǎn)生也始于對機(jī)器的模仿。
但是,計算機(jī)并非只是機(jī)器那么簡單。計算機(jī)是頭腦延伸的工具(頭腦的自行車),同時也是一種不同類型的表達(dá)媒體。因此,這種工具看起來越來越不像機(jī)器,而更像我們頭腦的一部分,以及一種如寫作、繪畫、雕刻、電影等一樣的表達(dá)形式。
面向?qū)ο蟪绦蛟O(shè)計(Object-oriented Programming, OOP)便是這種以計算機(jī)作為表達(dá)媒體的大趨勢中的組成部分。
許多人在沒有了解面向?qū)ο蟪绦蛟O(shè)計的全貌之間,感覺無法輕松自在地從事此類編程。因此,本章介紹的是面向?qū)ο蟮脑O(shè)計。如果是還沒有接觸過面向?qū)ο笳Z言的同學(xué),建議先略過本章。越過本章并不影響對JAVA的學(xué)習(xí),不過此后還需回頭來看本章。
1.1 抽象過程
所有編程語言都提供抽象機(jī)制??梢哉J(rèn)為,人們所能夠解決的問題的復(fù)雜性直接取決于抽象的類型和質(zhì)量。
所謂的“類型”是指“所抽象的是什么?”匯編語言是對底層機(jī)器的輕微抽象。“命令式”語言(FORTRAN、BASIC、C等)都是對匯編語言的抽象。這些語言在匯編語言的基礎(chǔ)上有了大幅的改進(jìn),但是它們所作的主要抽象仍要求在解決問題時要基于計算機(jī)的結(jié)構(gòu),而不是基于所要解決的問題的結(jié)構(gòu)來考慮。
程序員必須建立起在機(jī)器模型(位于“解空間”內(nèi),這是你對問題建模的地方,例如計算機(jī))和實際待解決問題的模型(位于“問題空間”內(nèi),這是問題存在的地方,例如一項業(yè)務(wù))之間的關(guān)聯(lián)。
建立這種映射是費力的,而且這不屬于編程語言所固定的功能,這使得程序難以編寫,并且維護(hù)代價高昂,同時也產(chǎn)生了作為副產(chǎn)物的整個* “編程方法”行業(yè)*。
另一種對機(jī)器建模的方式就是只針對待解問題建模。早期的編程語言,如LISP和APL,都是選擇考慮世界的某些特定視圖(分別對應(yīng)于“所有問題最終都是列表”或者“所有問題都是算法形式的”)。PROLOG則將所有問題都轉(zhuǎn)換成決策鏈。此外還產(chǎn)生了基于約束條件編程的語言和專門通過對圖形符號操作來實現(xiàn)編程的語言(后者被證明限制性過強(qiáng))。這些方式對于它們所要解決的特定類型問題都是不錯的解決方案,當(dāng)時一旦超過其特定領(lǐng)域,它們就力不從心了。
面向?qū)ο蠓绞酵ㄟ^向程序員提供表示問題空間中的元素工具而更進(jìn)了一步(就是表示問題的形式更容易了)。這種表示方式非常通用,使得程序員不受限于任何特定類型的問題。我們將問題空間中的元素(所面對的待解決問題)及其解空間(解決問題的地方)中的表示稱為“對象”。
這種思想的實質(zhì)是:程序可以通過添加新類型的對象使自身適用于某個特定問題。因此,當(dāng)我們在閱讀描述解決方案的代碼的同時,也是在閱讀問題的表述。相對以前我們所使用的語言(某些編程語言的設(shè)計者認(rèn)為面向?qū)ο缶幊瘫旧聿蛔阋暂p松地解決所有編程問題,所以他們提倡將不同的方式結(jié)合到多聚合編程語言中),這是一種更靈活和更有力的語言抽象。所以,OOP允許根據(jù)問題來描述問題,而不是根據(jù)運行解決方案的計算機(jī)來描述問題。
即使如此,它仍然與計算機(jī)有聯(lián)系:每個對象看起來都像一臺微型計算機(jī)—它具有狀態(tài),還具有操作,用戶可以要求對象執(zhí)行這些操作。如果要對現(xiàn)實世界中的對象做類比,那么說它們都具有特性和行為似乎不錯。
Alan Kay曾經(jīng)總結(jié)了第一個成功的面向?qū)ο笳Z言、同時也是JAVA所基于的語言之一的Smalltalk(Smalltalk被公認(rèn)為歷史上第二個面向?qū)ο蟮某绦蛟O(shè)計語言和第一個真正的集成開發(fā)環(huán)境 (IDE),Smalltalk對其它眾多的程序設(shè)計語言的產(chǎn)生起到了極大的推動作用,主要有:Objective-C,Actor, Java 和Ruby等)的五個基本特性,這些特性表現(xiàn)了一種純粹的面向?qū)ο蟪绦蚍绞?#xff1a;
- 萬物皆為對象。將對象視為奇特的變量,它可以存儲數(shù)據(jù)。理論上講,你可以抽取待求解問題的任何概念化構(gòu)件(狗、建筑物、服務(wù)等),將其表示為程序中的對象。
- 程序是對象的集合,它們通過發(fā)送消息來告知彼此所要做的。要想請求一個對象,就必須對該對象發(fā)送一條消息。更具體地說,可以把消息想象為對某個特定對象的方法的調(diào)用請求。
- 每個對象都有自己的由其他對象所構(gòu)成的存儲。換句話說,可以通過現(xiàn)有對象創(chuàng)建新類型的對象。因此,可以在程序中構(gòu)件復(fù)雜的體系,同時將其復(fù)雜性隱藏在對象的簡單性背后。
- 每個對象都擁有其類型。按照通用的說法,“每個對象都是某個類(class)的一個實例(instance)”,這里“類”就是“類型”的同義詞。每個類最重要的區(qū)別就是“可以發(fā)送什么樣的消息給它”。
- 某一特定類型的所有對象都可以接收同樣的消息。這是一句意味深長的表述,你在稍后便會看到。因為“圓形”類型的對象同時也是“幾何形”類型的對象,所以一個“圓形”對象必定能夠接受發(fā)送給“幾何形”對象的消息。這意味著可以編寫與“幾何形”交互并自動處理所有幾何形性質(zhì)相關(guān)的事務(wù)代碼。這種可替代性是OOP中最強(qiáng)有力的概念之一。
Booch對對象提出一個更加簡潔的描述:對象具有狀態(tài)、行為和標(biāo)識。這意味著每一個對象都可以擁有內(nèi)部數(shù)據(jù)(它們給出了該對象的狀態(tài))和方法(它們產(chǎn)生行為),并且每一個對象都可以唯一地與其他對象區(qū)分開來,具體說來,就是每一個對象在內(nèi)存中都有一個唯一的地址(這確實顯得有一點過于受限,因為對象可以存在于不同的機(jī)器和地址空間中,它們還可以被存儲在硬盤上,在這些情況下,對象的表示就必須由內(nèi)存地址之外的東西來確定了)。
1.2 每個對象都有一個接口
亞里士多德大概是第一個深入研究類型(type)的哲學(xué)家,他曾提出過魚類和鳥類這樣的概念。所有的對象都是唯一的,也是與之具有相同特性和行為的類中一例。這種思想被直接應(yīng)用于第一個面向?qū)ο笳Z言Simula-67,它在程序中使用基本關(guān)鍵字class來引入新的類型。
在程序執(zhí)行期間具有不同的狀態(tài)而其他方面都相似的對象會被分組到對象的類中,這就是關(guān)鍵字class的由來。每個類的成員或者元素都具有某種共性。
創(chuàng)建抽象數(shù)據(jù)類型(類)是面向?qū)ο蟪绦蛟O(shè)計的基本概念之一。抽象數(shù)據(jù)類型的運行方式與內(nèi)置類型幾乎完全一致:你可以創(chuàng)建某一類型的變量(對象或者說實例),然后操作這些變量(稱其為發(fā)送消息或者請求;發(fā)送消息,對象就知道要做什么)。
盡管我們在面向?qū)ο蟪绦蛟O(shè)計中實際上進(jìn)行的是創(chuàng)建新的數(shù)據(jù)類型,但事實上所有的面向?qū)ο蟪绦蛟O(shè)計語言都使用class這個關(guān)鍵詞來表示數(shù)據(jù)類型。當(dāng)看到類型一詞時,可將其作為類來考慮,反之亦然(有些人對此會區(qū)別對待,他們認(rèn)為:類型決定接口(定義一組操作的集合),而類是該接口的一個特定實現(xiàn))。
類描述了具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象集合,所以一個類實際上就是一個數(shù)據(jù)類型。例如所有浮點型數(shù)字具有相同特性和行為集合。二者的差異在于,程序員可以通過定義類來適應(yīng)問題,而不再被迫只能使用現(xiàn)有的用來表示機(jī)器中的存儲單元的數(shù)據(jù)類型。
事實上,面向?qū)ο蟪绦蛟O(shè)計的挑戰(zhàn)之一,就是在問題空間的元素和解空間的對象之間創(chuàng)建一對一的映射。
但是,怎樣才能獲取有用的對象?每個對象都只能滿足某些請求,這些請求由對象的接口所定義,決定接口的便是類型。
以燈泡為例:
接口確定了對某一個特定對象所發(fā)出的請求。但是,在程序中必須有滿足這些請求的代碼。這些代碼與隱藏的數(shù)據(jù)一起構(gòu)成了實現(xiàn)。從過程型編程的觀點來看,這并不太復(fù)雜。
在類型中,每一個可能的請求都有一個方法與之相關(guān)聯(lián),當(dāng)向?qū)ο蟀l(fā)送請求是,與之相關(guān)聯(lián)的方法就會被調(diào)用(例如類型Light的一個對象lt執(zhí)行了on()操作,控制對象lt的開啟行為)。
1.3 每個對象都提供服務(wù)
當(dāng)正在試圖開發(fā)或理解一個程序設(shè)計是,最好的方法之一就是將對象想象為“服務(wù)提供者”。程序本身將向用戶提供服務(wù),它將通過調(diào)用其他對象提供的服務(wù)來實現(xiàn)這一目的。你的目標(biāo)就是去創(chuàng)建(或者最好是在現(xiàn)有代碼庫中尋找)能夠提供理想的服務(wù)來解決問題的一系列對象。
著手從事這件事的一種方式就是問一下自己:“如果我可以將問題從表象中抽取出來,那么什么樣的對象可以馬上解決我的問題呢?”
將對象看做服務(wù)提供者還有一個附帶的好處:它有助于提高對象的內(nèi)聚性。在良好的面向?qū)ο笤O(shè)計中,每個對象都可以很好的完成一項任務(wù),但是它并不試圖做更多的事。
將對象作為服務(wù)提供者看待是一件偉大的簡化工具。這不僅在設(shè)計過程中非常有用,而且當(dāng)其他人試圖理解你的代碼或重用某個對象時,如果它們看出了這個對象所能提供的服務(wù)的價值,它會使調(diào)整對象以適應(yīng)其設(shè)計的過程變得簡單的多。
1.4 被隱藏的具體實現(xiàn)
將程序開發(fā)人員按照角色分為 類創(chuàng)建者 和 客戶端程序員。
- 客戶端程序員的目標(biāo)是手機(jī)各種用來實現(xiàn)快速應(yīng)用開發(fā)的類。
- 類創(chuàng)建者的目標(biāo)是構(gòu)建類,這種類只向客戶端程序員暴露必須的部分,而隱藏其他部分。被隱藏的部分通常代表對象內(nèi)部脆弱的部分,它們很容易被粗心的或不知情的客戶端程序員鎖毀壞,因此將實現(xiàn)隱藏起來可以減少程序bug。
正是因為存在類創(chuàng)建者與客戶端程序員的這種關(guān)系,訪問控制符就有了存在的原因:
- 讓客戶端程序員無法觸及他們不應(yīng)該觸及的部分。
- 允許庫設(shè)計者可以改變類內(nèi)部的工作方式而不用擔(dān)心會影響到客戶端程序員。或者說,客戶端程序員不必?fù)?dān)心自己編寫的代碼需要隨類庫的改變而出現(xiàn)程序錯誤。
JAVA用三個關(guān)鍵字在類的內(nèi)部設(shè)定邊界:public、private、protected。分別是公共的、私有的、內(nèi)部的。此后會說明到。
JAVA還有一種默認(rèn)的訪問權(quán)限,即當(dāng)沒有使用前面提到的三個關(guān)鍵字的任何一個。這種權(quán)限通常被稱為包訪問權(quán)限。
1.5 復(fù)用具體實現(xiàn)
產(chǎn)生一個具有可復(fù)用性的代碼并不容易,需要豐富的經(jīng)驗和敏銳的洞察力。代碼復(fù)用是面向?qū)ο蟪绦蛟O(shè)計語言所提供的最了不起的優(yōu)點之一。
最簡單地復(fù)用某個類的方式就是直接使用該類的一個對象,此外也可以將那個類的一個對象置于某個新類中。
我們將現(xiàn)有的類組合成新的類,這種概念被稱為組合(composition)。舉個例子,就是一個類中創(chuàng)建幾個對象。
如果組合是動態(tài)發(fā)生的,那么通常被稱為聚合(aggregation)。舉個例子,新類的構(gòu)造函數(shù)需要傳入一個對象,或者說可以 get/set 變換其中的對象。
組合帶來了極大的靈活性。新類的成員對象通常都被聲明為 private,使得使用新類的客戶端程序員不能訪問它們。
我們還知道,繼承也擁有一定的復(fù)用性。但是繼承如果過多,會導(dǎo)致設(shè)計很復(fù)雜。所以我們在考慮是使用繼承還是組合時,首先考慮組合,因為它更加簡單而靈活。
1.6 繼承
對象這種概念,本身就是十分方便的工具,使得你可以通過概念將數(shù)據(jù)和功能封裝到一起,因此可以對問題空間的觀念給出恰當(dāng)?shù)谋硎?/strong>。
遺憾的是,這樣做還是有很多麻煩:在創(chuàng)建了一個類之后,即使另一個新類與其具有相似的功能,你還是得重新創(chuàng)建一個新類。
如果我們能夠以現(xiàn)有的類為基礎(chǔ),然后稍作添加和修改那就好多了。通過繼承便可以達(dá)到這樣的效果。不過也有例外,當(dāng)基類發(fā)生改變,子類也會反應(yīng)出相應(yīng)的變動。
我們知道繼承之后,導(dǎo)出類并不擁有基類的所有成員。它擁有一個更重要的意義,就是復(fù)制了基類的接口。所以,可以發(fā)送給基類對象的消息同時也可以發(fā)送給導(dǎo)出類對象。意味著導(dǎo)出類與基類具有相同的類型。
當(dāng)然,如果只是簡單的繼承而并不做其他任何事情的話。貌似沒有什么意義,于是我們通常有兩種方式讓繼承顯得有意義。
- 直接在導(dǎo)出類中添加新方法。
- 覆蓋基類中的方法
1.61 “是一個”與“像是一個”關(guān)系
替代原則是指可以用一個導(dǎo)出類對象來完全替代一個基類對象。
通俗的說“is-a”關(guān)系就是繼承關(guān)系。
“is-like-a”關(guān)系就是接口關(guān)系。
1.7 伴隨多態(tài)的可互換對象
在處理類型的層次結(jié)構(gòu)時,經(jīng)常想把一個對象不當(dāng)作它所屬的特定類型來對待,而是將其當(dāng)作其基類的對象來對待。
如下圖:
我們通過 BirController 這個類來控制 Bird 對象的操作。我們即使忽略 Bird 對象的具體類型,也會產(chǎn)生正確的行為。例如,bird是一個Goose(企鵝),當(dāng)我們通過BirdController.reLocate()時,也可以得到一個正確的 企鵝移動的結(jié)果 。
面向?qū)ο蟪绦蛟O(shè)計的最重要的妙訣:編譯器不可能產(chǎn)生傳統(tǒng)意義上的函數(shù)調(diào)用。
一個非面向?qū)ο缶幊痰木幾g器產(chǎn)生的函數(shù)調(diào)用會引起所謂的前期綁定。
在OOP中,程序知道運行時才能夠有確定代碼的地址。所以,當(dāng)消息發(fā)送到一個泛化對象時,必須采用其他的機(jī)制。為了解決這個問題,面向?qū)ο蟪绦蛟O(shè)計語言使用了后期綁定的概念。后期綁定是在當(dāng)對象發(fā)送消息時,被調(diào)用的代碼直到運行時才能確定代碼地址。
為了執(zhí)行后期綁定,JAVA使用了一小段特殊的代碼來替代絕對地址調(diào)用(這個表示自己也不知道)。
在某些語言中,必須明確聲明希望某個方法具備后期綁定屬性所帶來的靈活性(C++是使用virtual關(guān)鍵字來實現(xiàn)的)。在這類語言中,方法的默認(rèn)情況下不是動態(tài)綁定的。
JAVA中,動態(tài)綁定則是默認(rèn)行為,不需要添加額外的關(guān)鍵字來實現(xiàn)多態(tài)。
把將導(dǎo)出類看做是它的基類的過程稱為向上轉(zhuǎn)型(upcasting)。
1.8 單根繼承結(jié)構(gòu)
在OOP中,自C++面世以來就已變得非常矚目的一個問題就是,是否所有的累最終都繼承單一的基類。在JAVA中(事實上還包括除C++以外的所有OOP語言),答案是yes,這個終極基類的名字就是Object。
單根繼承結(jié)構(gòu)保證所有對象都具備某些功能(我總覺得我自己沒說到點上,為什么堆上創(chuàng)建變得容易了?)。
單根繼承結(jié)構(gòu)使垃圾回收器的實現(xiàn)變得容易得多(這一想象,我們運行程序的時候還有一個垃圾回收器線程,控制著Object對象的釋放)。這樣JAVA給編程帶來了更大的靈活性。因為我們不需要考慮某些對象釋放異常等等。這與C++是大為不同的地方。
1.9 容器
就是具有存儲功能的類,例如List(用于存儲序列)、Map(用來存儲對象直接的關(guān)聯(lián))、Set(每種對象只持有一個),以及諸如隊列、樹、堆棧等更多的構(gòu)件。
不同的類提供了不同的接口和行為。這些類的實現(xiàn)與數(shù)據(jù)結(jié)構(gòu)一書息息相關(guān)。
1.9.1 參數(shù)化類型
在JAVA SE5出現(xiàn)之前,我們的容器存儲的對象只有Object類型。這種模式可能是非常好,它能夠存儲任何東西。當(dāng)我們將一個對象存入容器中,這個對象將會向上轉(zhuǎn)型。此后,我們?nèi)〕鰰r也需要對這個對象向下轉(zhuǎn)型。
我們考慮兩個問題,第一個問題是:向上轉(zhuǎn)型會出現(xiàn)問題嗎?
答案顯然是不會。我們知道任何東西都繼承Object。
第二個問題:向下轉(zhuǎn)型會出現(xiàn)問題嗎?
答案是會出現(xiàn)問題,如果向下轉(zhuǎn)型為錯誤類型,就會得到一個異常。
在JAVA SE5出現(xiàn)之后,提出了一個泛型的概念。自此,我們將使用泛型來指定容器存儲的數(shù)據(jù)類型。
1.10 對象的創(chuàng)建和生命周期
創(chuàng)建對象的兩種方式:
- C++認(rèn)為效率控制是重要的議題,所以給程序員提供了選擇的權(quán)利。為了追求最大的執(zhí)行速度,對象的存儲空間和生命周期可以在編寫程序時確定,這可以通過將對象置于堆棧或靜態(tài)存儲區(qū)內(nèi)來實現(xiàn)。這種方式將存儲空間和釋放置于優(yōu)先考慮的位置,同時也犧牲了靈活性。(可能大多數(shù)人不理解為什么失去了靈活性?看下面你應(yīng)該就能懂為什么了!)
- 第二種方式是在被稱為堆的內(nèi)存池中動態(tài)的創(chuàng)建對象。這種方式中,知道運行時才知道需要多少對象,它們的生命周期如何,以及它們的具體類型是什么。這些答案只能在程序運行時相關(guān)代碼被執(zhí)行到的那一刻才能確定(這很重要)。
因為在堆中創(chuàng)建空間遠(yuǎn)比在堆棧創(chuàng)建空間慢,這也是為什么JAVA比C++效率慢的原因。
動態(tài)方式有這樣一個一般性的邏輯假設(shè):對象趨向于變得復(fù)雜,所以查找和釋放存儲空間的開銷不會對對象的創(chuàng)建造成重大沖擊(說明動態(tài)方式相對穩(wěn)定?)。動態(tài)方式所帶來的更大的靈活性正是解決一般化編程問題的要點所在。
JAVA完全采用了動態(tài)內(nèi)存分配方式。使用 new 關(guān)鍵字來構(gòu)建對象的動態(tài)實例。
對象的生命周期:
對于允許在堆棧上創(chuàng)建對象的語言,編譯器可以確定對象存活的時間,并可以自動銷毀它。
然而,如果是在堆上創(chuàng)建對象,編譯器就會對它的生命周期一無所知。
在像C++這樣的語言中,必須通過編程方式來確定何時銷毀對象,這可能會因為不能正確處理而導(dǎo)致內(nèi)存泄漏(這在C++程序中是常見的問題,學(xué)過C++的同學(xué)應(yīng)該懂 new 一個對象,通過new生成的對象存放在堆中)。
JAVA提供了被稱為“垃圾回收器”的機(jī)制,它可以自動發(fā)現(xiàn)對象何時不再被使用,并繼而銷毀它。
JAVA的垃圾回收器被設(shè)計用來處理內(nèi)存釋放問題。垃圾回收期“知道”對象何時不再被使用,并自動釋放對象占用的內(nèi)存。這一點同所有對象都是繼承自單根基類Object以及只能以一種方式創(chuàng)建對象(在堆上創(chuàng)建)這兩個特性結(jié)合起來,使得用JAVA編程的過程較之用C++編程要簡單的多,所要做出的決策和要克服的障礙也要少的多(這也是導(dǎo)致效率比C++慢的原因)。
1.11 異常處理:處理錯誤
異常處理將錯誤處理直接置于編程語言中,有時甚至置于操作系統(tǒng)中。
異常是一種對象,它從出錯地地點被“拋出”,并被專門設(shè)計用來處理特定類型錯誤的相應(yīng)的異常處理器“捕獲”。
異常處理就像是與程序正常執(zhí)行路徑并行的、在錯誤發(fā)生時執(zhí)行的另一條路徑。因為它是另一條完全分離的執(zhí)行路徑,所以它不會干擾正常的代碼執(zhí)行。這往往使得代碼編寫變得簡單,因為不需要被迫定期檢查錯誤。
異常提供了一種從錯誤狀況進(jìn)行可靠恢復(fù)的途徑?,F(xiàn)在不再是只能退出程序,你可以經(jīng)常進(jìn)行校正,并回復(fù)程序的執(zhí)行,這些都有助于編寫出更健壯的程序。
1.12 并發(fā)編程
在計算機(jī)百年城中有一個基本概念,就是在同一時刻處理多個任務(wù)的思想。
使用這類編程時,是因為我們想把問題切分成多個可獨立運行的部分,從而提高程序的響應(yīng)能力。
并發(fā)有一個隱患:資源共享。如果有多個并行任務(wù)都要訪問同一項資源,那么就會出現(xiàn)問題。例如,兩個進(jìn)程不恩呢該同時向一臺打印機(jī)發(fā)送消息。為了解決這個問題,必須將打印機(jī)在被使用期間加鎖,待正在任務(wù)的進(jìn)程執(zhí)行完成后釋放鎖。
1.13 JAVA 與 Internet
JAVA不僅僅在傳統(tǒng)的單機(jī)程序設(shè)計問題非常有用之外,同樣重要的是,它還解決了在萬維網(wǎng)(WWW)上的程序設(shè)計問題(不管是以前的CGI還是到現(xiàn)在的JAVA EE)。
1.13.1 Web是什么
2個點可以概括:
- 客戶/服務(wù)器計算技術(shù)
- Web就是一臺巨型服務(wù)器
由這兩點就可以說明,一切計算都交由服務(wù)器處理(其實現(xiàn)在的Web是將部分計算由客戶端來做,而且最近還出現(xiàn)了Node.js),并且由此可知,它是安全的。
1.13.2 客戶端編程
這一個篇幅我可能無法做出客觀的解釋,因為我也沒接觸過applet編程。聽說是因為flash火了之后,applet被淘汰了。還有的好像說是因為一些商業(yè)性的原因?qū)е碌摹2贿^本人見過java的applet,發(fā)現(xiàn)applet太難使用了。還需要安裝七七八八的東西才可以用。
1.13.3 服務(wù)器端編程
我們這里強(qiáng)調(diào)一個服務(wù)器端的編程,那就是現(xiàn)在流行的JSP和servlet所編寫的服務(wù)器程序。雖然還有更高級的東西,比如SSH、SSM、Spring Boot這類聽著都很高端的技術(shù),但是,他們都是需要JSP和servlet基礎(chǔ)才可以看得懂的并且使用的技術(shù)。因為基礎(chǔ)不好會導(dǎo)致開發(fā)時遇到問題解決不了,這也是為什么筆者回來重新看基礎(chǔ)的原因。
1.14 總結(jié)
面向?qū)ο蟪绦蛟O(shè)計帶給人們的喜悅之一就是:對于設(shè)計良好的程序,通過閱讀它就可以很容易地理解其代碼。通常,其代碼也會少很多,因為許多問題都可以通過重用現(xiàn)有類庫代碼而得到解決。
本章所有內(nèi)容都是重點,因為這與之后的開發(fā)息息相關(guān)。OOP程序設(shè)計時,你必須對OOP的概念有所了解,甚至有時候了解OOP的概念還不夠,因為你編寫程序時會遇到非常多你自己無法預(yù)測到的難題。
總結(jié)
以上是生活随笔為你收集整理的对象导论---JAVA编程思想的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 产品经理才看的懂
- 下一篇: 数据结构与算法---笔记