更新時(shí)間:2020-09-22 17:07:37 來源:動力節(jié)點(diǎn) 瀏覽1385次
說到j(luò)ava語言,相信很多人想起來的第一個(gè)特性就是面向?qū)ο筇卣?/span>,對于java零基礎(chǔ)的小白們來說,開始學(xué)習(xí)的第一課也是面向?qū)ο螅裉靵碛懻撘幌?strong>面向?qū)ο蟪绦蛟O(shè)計(jì)這一思想該怎樣理解,以及在java編程中起到了什么樣的作用。
面向?qū)ο蟪绦蛟O(shè)計(jì)是當(dāng)今主流的程序設(shè)計(jì)范型,英文簡稱是OOP,它已經(jīng)取代了70年代早期的“結(jié)構(gòu)化”過程化程序設(shè)計(jì)開發(fā)技術(shù),java是完全面向?qū)ο蟮模^對不能使用人們熟悉的過程式風(fēng)格設(shè)計(jì)java程序。
下面讓我們從一個(gè)看似與程序設(shè)計(jì)無關(guān)的例子開始,這個(gè)例子是這樣說的:為什么Compaq、Dell、Gateway以及其他一些主流的PC機(jī)制造商能夠這樣快地發(fā)展壯大?很多人可能會說:他們能夠生產(chǎn)具有良好性能的計(jì)算機(jī),并以低廉的價(jià)格銷售,從而滿足了人們對計(jì)算機(jī)需要的迅猛增長,順應(yīng)了時(shí)代的需求。然而,讓我們進(jìn)一步地思考一下,他們?yōu)槭裁茨軌蛑圃斐鲞@么多種型號的計(jì)算機(jī),并以如此快的速度對需求變化做出響應(yīng)?
其中主要原因是這些公司將大量的工作交給了他人。他們從信譽(yù)較好的廠商那里購買組件,然后將它們組裝起來。這樣一來,往往不需要在設(shè)計(jì)與制作電源、磁盤驅(qū)動器、板以及其他組件上花費(fèi)過多的時(shí)間和資金。與自行研制相比,這樣能夠以更快的速度、更少的資金生產(chǎn)產(chǎn)品,并快速地適應(yīng)需求變化。
個(gè)人計(jì)算機(jī)制造商所購買的就是“預(yù)包裝功能”(prepackaged functionality)。例如,當(dāng)購買一個(gè)電源的時(shí)候,實(shí)際上購買的是具有一些屬性(大小、形狀等等)和功能(穩(wěn)壓輸出、實(shí)際功率等)的東西。Compaq公司就是一個(gè)應(yīng)用這種高效生產(chǎn)過程的典范。當(dāng)他們從自行研制大部分零部件轉(zhuǎn)向主要依靠購買部件時(shí),其盈利獲得了大幅度地提升。
面向?qū)ο蟪绦蛟O(shè)計(jì)也是基于同樣的想法,它認(rèn)為程序是由對象組成的,這些對象有自己的屬性和能夠執(zhí)行的操作。是自己構(gòu)造對象還是從外界購買對象完全取決于預(yù)算或時(shí)間。但是,從根本上說,只要對象能夠滿足要求,就不必關(guān)心其功能的具體實(shí)現(xiàn)過程。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,只需要關(guān)注對象的外表,就如同計(jì)算機(jī)制造商只關(guān)心電源是否符合要求,不必關(guān)心其內(nèi)部結(jié)構(gòu)一樣,絕大多數(shù)的java程序員不必關(guān)心對象的具體實(shí)現(xiàn),只要保證對象滿足他們的需求就可以了。
傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)通過設(shè)計(jì)一系列的過程(即算法)來求解問題。這些過程一旦被確定,下一步就要開始尋找存儲數(shù)據(jù)的方式。這就是Pascal語言的設(shè)計(jì)者Niklaus Wirth將其編著的有關(guān)程序設(shè)計(jì)的著名書籍命名為《Algorithms+Data Structure=Programs》(算法+數(shù)據(jù)結(jié)構(gòu)=程序) (Prentice Hall, 1975 )的原因。請注意,在Wirth命名的書名中,算法是第一位的,而數(shù)據(jù)結(jié)構(gòu)是第二位的。這就生動地表述了程序員當(dāng)時(shí)的工作方式。首先要確定如何操縱數(shù)據(jù);然后再決定如何組織數(shù)據(jù)的結(jié)構(gòu),以便操縱數(shù)據(jù)。OOP卻調(diào)換了這個(gè)次序,將數(shù)據(jù)放在第一位,然后再考慮操縱數(shù)據(jù)的算法。
面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵是讓每一個(gè)對象負(fù)責(zé)執(zhí)行一組相關(guān)的任務(wù)。如果一個(gè)對象依賴于另一個(gè)對象負(fù)責(zé)處理的任務(wù),那么它就去訪問那個(gè)包括該任務(wù)的對象。此時(shí),第一個(gè)對象請求第二個(gè)對象執(zhí)行任務(wù)。這種工作方式實(shí)際上是由過程化程序設(shè)計(jì)中人們所熟悉的過程調(diào)用實(shí)現(xiàn)的。(在java程序設(shè)計(jì)語言中,這些過程調(diào)用被稱為方法調(diào)用。)
特別需要說明的是,一個(gè)對象既不能直接訪問另一個(gè)對象內(nèi)部的數(shù)據(jù),也不能讓其他對象直接訪問自己內(nèi)部的數(shù)據(jù)。對象之間的所有通信都是通過方法調(diào)用完成的。通過封裝對象數(shù)據(jù),最大限度地提高可重用性,減少數(shù)據(jù)的依賴性,并將程序的調(diào)試時(shí)間降到最短。
當(dāng)然,如同過程化程序設(shè)計(jì)語言中的模塊一樣,不要讓一個(gè)對象承擔(dān)的任務(wù)過多。創(chuàng)建一個(gè)僅執(zhí)行少量任務(wù)的小型對象,會使設(shè)計(jì)和調(diào)試過程簡化;而創(chuàng)建一個(gè)內(nèi)部含有復(fù)雜數(shù)據(jù)和數(shù)百個(gè)過程的對象,會使設(shè)計(jì)與調(diào)試過程變得非常困難。
對于java的學(xué)習(xí)來說,在一開始能有整體編程思想和java基本思想的認(rèn)知的把握,對學(xué)習(xí)是十分有用的,面向?qū)ο蟪绦蛟O(shè)計(jì)對java是十分重要的。希望通過這篇文章的介紹,大家可以對面向?qū)ο蟪绦蛟O(shè)計(jì)有一定的理解,從而可以對java的學(xué)習(xí)起到一定的作用。
初級 202925
初級 203221
初級 202629
初級 203743