Java零基礎學習之路(八)Java物件導向

qwer1030274531發表於2020-12-09

本章節目標:

瞭解物件導向,知道類和物件的區別,會進行類的定義。

 

知識框架:

 

 

Java物件導向程式設計和麵向過程程式設計的區別

 

“程式導向”(Procedure Oriented)是一種以過程為中心的程式設計思想,簡稱OP。“程式導向”也可稱之為“面向記錄”程式設計思想,就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了。所以程式導向的程式設計方式關注點不在“事物”上,而是做這件事分幾步,先做什麼,後做什麼。例如:早晨起來:起床、穿衣、洗漱、上班,只要按照這個步驟來,就能實現“一天”的功能,整個這個過程中關注的是一步一步怎麼做,並沒有關注“人”這個事物。再例如:開門、調整座椅、繫好安全帶、踩離合、啟動、掛檔、給油,只要按照這個步驟來,車就走了,顯然關注點還是在步驟上,只要實現每一步就行,整個過程並沒有關注“汽車”這個事物。

 

“物件導向”(Object Oriented)是一種以物件為中心的程式設計思想,簡稱OO。隨著計算機技術的不斷提高,計算機被用於解決越來越複雜的問題。一切事物皆物件,透過物件導向的方式,將現實世界的事物抽象成物件。透過物件導向的方法,更利於用人理解的方式對複雜系統進行分析、設計與程式設計。同時,物件導向能有效提高程式設計的效率,透過封裝技術,可以像搭積木的一樣快速開發出一個全新的系統。物件導向將物件作為程式的基本單元,將程式和資料封裝其中,以提高軟體的重用性、靈活性和擴充套件性。

 

使用物件導向程式設計思想開發系統,在現代開發中會將物件導向貫穿整個過程,一般包括:OOA/OOD/OOP:

● OOA:物件導向分析(Object-Oriented Analysis)

● OOD:物件導向設計(Object-Oriented Design)

● OOP:物件導向程式設計(Object-Oriented Programming)

 

程式導向和麵向物件有什麼關係呢?

程式導向其實是最為實際的一種思考方式,就算是物件導向的方法也是含有程式導向的思想。可以說程式導向是一種基礎的方法。它考慮的是實際地實現。一般的程式導向是從上往下步步求精。物件導向主要是把事物給物件化,物件包括屬性與行為。當程式規模不是很大時,程式導向的方法還會體現出一種優勢。因為程式的流程很清楚,按著模組與函式的方法可以很好的組織。但對於複雜而龐大的系統來說,程式導向顯得就很無力了。

 

為了幫助大家理解程式導向和麵向物件,我們再來設想一個場景,假如說編寫一段程式,模擬一個人抽菸的場景,採用程式導向的方式是這樣的:

買菸->買打火機->找能夠抽菸的場合->點燃香菸->開抽,只要按照這個流程一步一步來,就可以實現抽菸場景,採用物件導向的方式關注點就不一樣了,我們會想這個場景都有什麼事物參與,每個事物應該有什麼行為,然後將這些事物組合在一起,來描述這個場景,例如:一個會抽菸的人(物件)+香菸(物件)+打火機(物件)+允許抽菸的場所(物件),將以上4個物件組合在一起,就實現了抽菸場景,其中採用物件導向的方式開發具有很強的擴充套件力,例如:人這個物件是可以更換的,打火機也是可以更換的,香菸的品牌也是可以更換的,包括抽菸的場合也是可以更換的。如果採用程式導向方式開發,一步依賴另一步,任何一步都不能變化,變化其中一步則整個軟體都會受到影響。

網上發現了一篇文章,說了一下OP與OO的不同,並且打了一個比喻,通俗易懂。有人這麼形容OP和OO的不同:

用程式導向的方法寫出來的程式是一份蛋炒飯,而用物件導向寫出來的程式是一份蓋澆飯。所謂蓋澆飯,北京叫蓋飯,東北叫燴飯,廣東叫碟頭飯,就是在一碗白米飯上面澆上一份蓋菜,你喜歡什麼菜,你就澆上什麼菜。我覺得這個比喻還是比較貼切的。蛋炒飯製作的細節,我不太清楚,因為我沒當過廚師,也不會做飯,但最後的一道工序肯定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。蛋炒飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那麼唯一的辦法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這麼多麻煩,你只需要把上面的蓋菜撥掉,更換一份蓋菜就可以了。蓋澆飯的缺點是入味不均,可能沒有蛋炒飯那麼香。到底是蛋炒飯好還是蓋澆飯好呢?其實這類問題都很難回答,非要比個上下高低的話,就必須設定一個場景,否則只能說是各有所長。如果大家都不是美食家,沒那麼多講究,那麼從飯館角度來講的話,做蓋澆飯顯然比蛋炒飯更有優勢,他可以組合出來任意多的組合,而且不會浪費。蓋澆飯的好處就是"菜""飯"分離,從而提高了製作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟體工程的專業術語就是"可維護性"比較好,"飯" 和"菜"的耦合度比較低。蛋炒飯將"蛋""飯"攪和在一起,想換"蛋""飯"中任何一種都很困難,耦合度很高,以至於"可維護性"比較差。軟體工程追求的目標之一就是可維護性,可維護性主要表現在3個方面:可理解性、可測試性和可修改性。物件導向的好處之一就是顯著的改善了軟體系統的可維護性。

對於程式語言來說,基於C語言的程式設計是程式導向的,C++只能說一半程式導向一半物件導向,java語言就是一門完全物件導向的程式語言。有C++基礎的同學,學習java應該很快,因為java底層是C++語言實現的。當然,除了java語言之外,還有很多都是完全物件導向的程式語言,例如:C#、Python等。

對於程式導向和麵向物件的理解,目前階段來說還是很難的,畢竟大家現在還停留在只會定義變數,寫個if語句階段,慢慢來吧,我們需要不斷的學習後面的內容,然後再加深對物件導向的理解。

Java物件導向特徵

Java物件導向具有三大特徵,這三大特徵目前大家只需要記住,後面我會進行一一講解:

● 封裝(Encapsulation)

● 繼承(Inheritance)

● 多型(Polymorphism)

任何一門物件導向的程式語言都具備以上三大特徵,例如:python、C#、java等。

Java類與物件的定義

Java物件導向之所以能夠成為主流,那是因為人習慣以物件的方式認識現實世界,例如我說:老虎。那你大腦中馬上呈現出一個老虎的樣子,對吧。

軟體存在的意義就是為了解決現實世界當中的問題,它必然模擬現實世界,也就是說現實世界中有什麼,軟體中就對應有什麼。 jiyuan/

Java物件導向程式設計思想中關注點是“物件”或者“事物”,那麼在程式語言當中要想建立物件則必須先有類,那麼類和物件分別是什麼,它們的區別和聯絡是什麼呢?

類是現實世界當中具有共同特徵的事物進行抽象形成的模板或概念。而物件是實際存在的個體。例如:“汽車”就是一個類(所有的汽車都有方向盤、發動機、都能形式,這是它們的共同特徵),“你家的那個汽車”就是一個真實存在的物件。或者說“明星”是一個類,“劉德華”就是一個物件。“沈騰”、“趙本山”、“宋丹丹”都是實際存在的物件,他們都屬於“笑星”類,類描述事物的共同特徵,那麼“笑星”類都有哪些共同特徵呢?笑星類都有姓名、性別、年齡等狀態資訊(屬性),他們還有一個共同的行為就是“演出”(方法)。但當具體到某個物件上之後,我們發現姓名是不同的,性別是不同的,年齡也是不同的,演出的效果也是不同的。所以我們在訪問姓名、性別、年齡的時候,必須先有笑星物件,透過真實存在的笑星物件去訪問他的屬性,包括“演出”的時候,只有“笑星”類是不行的,必須先有笑星物件,讓笑星物件去執行“演出”這個動作。

透過類可以建立物件,物件又被稱為例項(instance),這個過程也可以稱為例項化。物件1、2、3具有共同特徵,進行抽象形成了類,所以從物件到類稱為抽象。如下圖所示:

圖8-1:類和物件

透過以上的描述,我們得知:類 = 屬性 + 方法,而屬性描述的是狀態,方法描述的是行為動作。行為動作以方法的形式存在,那屬性以什麼形式存在呢?例如:姓名、性別、年齡,大家想起之前學習的變數了嗎?變數用來儲存資料。不錯,物件的屬性以變數形式存在,並且這裡所說的變數是我們之前提過的“成員變數當中的例項變數”。為什麼是例項變數呢,例項變數就是物件級別的變數,這樣的變數要求必須先存在物件,透過物件才能訪問。例如:“中國人”這個類,有一個屬性是“身份證號”,每一箇中國人的“身份證號”都是不一樣的,所以身份證號必須使用一個真實存在的“中國人物件”來訪問。不能使用“中國人”這個類去訪問身份證號。一個類可以例項化N多個物件,假設透過“中國人”這個類建立了100個“中國人物件”,那麼“身份證號”必然會有100個例項變數空間去儲存。

Java類的設計與發現 anhui/

理解了類和物件的概念之後,我們開始進行類的設計,那麼,應該怎麼在現實世界當中發現類呢?例如有這樣的背景:開發學生選課系統,要求能夠單獨對學生資訊、課程資訊進行維護,還要求能夠維護某學生選擇某些課程。根據以上的描述,我們可以看到上面的描述中有很多名詞,例如:學生、課程等。從這些名詞當中就可以發現類,例如:學生類、課程類。所有的學生都有學號、姓名、性別、出生日期等屬性,所有的課程都有課程編號、課程名字等屬性。

如果我們發現了類,並且發現了類中的屬性和方法,那麼應該以什麼形式展現出來呢,在團隊協作開發中應該如何讓其他專案組成員知曉你的設計呢,恐怕這個時候就需要使用UML了。Unified Modeling Language (UML)又稱統一建模語言或標準建模語言,是始於1997年一個OMG標準,它是一個支援模型化和軟體系統開發的圖形化語言,為軟體開發的所有階段提供模型化和視覺化支援,包括由需求分析到規格,到構造和配置。 物件導向的分析與設計(OOA&D,OOAD)方法的發展在80年代末至90年代中出現了一個高潮,UML是這個高潮的產物。它不僅統一了Booch、Rumbaugh和Jacobson的表示方法,而且對其作了進一步的發展,並最終統一為大眾所接受的標準建模語言。UML規範用來描述建模的概念有:類、物件、關聯、職責、行為、介面、用例、包、順序、協作,以及狀態。 zhumadian/

其實軟體開發和現實生活當中的建造大樓是一樣的,在建造大樓之前需要進行前期的設計,這個時候就需要建築工程師畫圖紙,圖紙上畫的都是一些符合某些標準的符號,負責建築的人員一定是能夠看懂這些標準符號的。而UML就是在軟體開發方面的一種圖示式語言,程式設計師在進行系統設計的時候,需要畫出UML建模圖,程式設計師根據UML建模圖進行開發。

那麼能夠實現UML圖的工具有哪些呢?例如:IBM Rational Rose、PowerDesigner、StarUML、MS Visio等,我們接下來使用Rational Rose工具畫一個類出來。請看下圖:

圖8-2:學生類的設計 heilongjiang/

透過以上類圖,我們可以看到一個學生有學號、姓名、年齡、性別屬性,並且有一個考試的方法。其中學號採用整數型,姓名採用字串型別,年齡採用整數型,性別採用布林型,考試返回值型別設計為浮點型double。

請大家注意,該小節內容屬於瞭解內容,目前還不需要掌握怎麼畫這些圖,只要知道從名詞中發現類,系統開發初期需要進行類的設計,而設計的時候就需要使用UML進行建模,瞭解幾個常見的建模工具就行了。

Java類中的定義 hebei/

以上所講內容使用java語言完全可以實現,因為java語言是一門完全物件導向的程式語言,當然,使用其他物件導向的程式語言也可以實現。當進行了類的設計之後,接下來就可以根據UML圖進行程式碼的編寫了,在程式碼級別上實現一個類,類怎麼定義呢?

[修飾符] class 類名 {類體 = 屬性 + 方法}

以上為類的簡單定義,實際上一個完整的類的定義要比以上語法複雜一些,以後再慢慢補充,先從簡單的開始。

接下來,根據UML圖,使用程式碼將“學生類”進行實現(只實現屬性),程式碼如下圖所示:

public class Student {	//學號	int no;	//姓名	String name;	//年齡	int age;	//性別	boolean sex;}

以上程式當中no、name、age、sex都是屬性,它們都是成員變數中的例項變數,所謂例項變數就是物件級別的變數,這些屬性要想訪問,必須先建立物件才能訪問,不能直接透過類去訪問,因為每一個學生的學號都是不一樣的。沒有學生物件,談何學號!  


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2740687/,如需轉載,請註明出處,否則將追究法律責任。

相關文章