Java零基礎快速入門|認識面向?qū)ο?/h1>

本篇文章主要內(nèi)容:
面向過程和面向?qū)ο蟮膮^(qū)別
面向?qū)ο笕筇卣?/strong>
類和對象的概念
類的發(fā)現(xiàn)和設計
類的定義
難點疑惑
學習目標
了解面向?qū)ο螅李惡蛯ο蟮膮^(qū)別,會進行類的定義。
知識框架

面向過程和面向?qū)ο蟮膮^(qū)別
“面向過程”(Procedure?Oriented)是一種以過程為中心的編程思想,簡稱 OP?!懊嫦蜻^程” 也可稱之為“面向記錄”編程思想,就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步 驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了。所以面向過程的編程方式關(guān)注點不 在“事物”上,而是做這件事分幾步,先做什么,后做什么。
例如:早晨起來:起床、穿衣、洗漱、上班,只要按照這個步驟來,就能實現(xiàn)“一天”的功能,整個這個過程中關(guān)注的是一步 一步怎么做,并沒有關(guān)注“人”這個事物。
再例如:開門、調(diào)整座椅、系好安全帶、踩離合、啟動、掛檔、給油,只要按照這個步驟來,車就走了,顯然關(guān)注點還是在步驟上,只要實現(xiàn)每 一步就行,整個過程并沒有關(guān)注“汽車”這個事物。
“面向?qū)ο蟆?/span>(Object??Oriented)是一種以對象為中心的編程思想,簡稱 OO。隨著計算機技術(shù)的不斷提高,計算機被用于解決越來越復雜的問題。一切事物皆對象,通過面向?qū)ο蟮姆绞剑?將現(xiàn)實世界的事物抽象成對象。通過面向?qū)ο蟮姆椒?,更利于用人理解的方式對復雜系統(tǒng)進行 分析、設計與編程。同時,面向?qū)ο竽苡行岣呔幊痰男?,通過封裝技術(shù),可以像搭積木的 一樣快速開發(fā)出一個全新的系統(tǒng)。面向?qū)ο髮ο笞鳛槌绦虻幕締卧?,將程序和?shù)據(jù)封裝其 中,以提高軟件的重用性、靈活性和擴展性。
使用面向?qū)ο缶幊趟枷腴_發(fā)系統(tǒng),在現(xiàn)代開發(fā)中會將面向?qū)ο筘灤┱麄€過程,一般包括:
OOA/OOD/OOP:
OOA:面向?qū)ο蠓治?/span>(Object-Oriented?Analysis)
OOD:面向?qū)ο笤O計(Object-Oriented?Design)
OOP:面向?qū)ο缶幊?/span>(Object-Oriented?Programming)
面向過程和面向?qū)ο笥惺裁搓P(guān)系呢?面向過程其實是最為實際的一種思考方式,就算是面向?qū)ο蟮姆椒ㄒ彩呛忻嫦蜻^程的思想??梢哉f面向過程是一種基礎的方法。它考慮的是實際地實現(xiàn)。一般的面向過程是從上往下步步求精。面向?qū)ο笾饕前咽挛锝o對象化,對象包括屬性與行為。當程序規(guī)模不是很大時,面向過程的方法還會體現(xiàn)出一種優(yōu)勢。因為程序的流程很清楚,按著模塊與函數(shù)的方法可以很好的組織。但對于復雜而龐大的系統(tǒng)來說,面向過程顯得就很無力了。
為了幫助大家理解面向過程和面向?qū)ο?,我們再來設想一個場景,假如說編寫一段程序, 模擬一個人抽煙的場景,采用面向過程的方式是這樣的:買煙->買打火機->找能夠抽煙的場合
->點燃香煙->開抽,只要按照這個流程一步一步來,就可以實現(xiàn)抽煙場景,采用面向?qū)ο蟮姆?式關(guān)注點就不一樣了,我們會想這個場景都有什么事物參與,每個事物應該有什么行為,然后 將這些事物組合在一起,來描述這個場景,例如:一個會抽煙的人(對象)+香煙(對象)+ ?打火機(對象)+允許抽煙的場所(對象),將以上4 個對象組合在一起,就實現(xiàn)了抽煙場景, 其中采用面向?qū)ο蟮姆绞介_發(fā)具有很強的擴展力,例如:人這個對象是可以更換的,打火機也 是可以更換的,香煙的品牌也是可以更換的,包括抽煙的場合也是可以更換的。如果采用面向過程方式開發(fā),一步依賴另一步,任何一步都不能變化,變化其中一步則整個軟件都會受到影 響。
網(wǎng)上發(fā)現(xiàn)了一篇文章,說了一下 OP?與 OO?的不同,并且打了一個比喻,通俗易懂。有人這么形容 OP ?和 OO?的不同:用面向過程的方法寫出來的程序是一份蛋炒飯,而用面向?qū)ο髮?/span>出來的程序是一份蓋澆飯。所謂蓋澆飯,北京叫蓋飯,東北叫燴飯,廣東叫碟頭飯,就是在一 碗白米飯上面澆上一份蓋菜,你喜歡什么菜,你就澆上什么菜。我覺得這個比喻還是比較貼切 的。蛋炒飯制作的細節(jié),我不太清楚,因為我沒當過廚師,也不會做飯,但最后的一道工序肯 定是把米飯和雞蛋混在一起炒勻。蓋澆飯呢,則是把米飯和蓋菜分別做好,你如果要一份紅燒 肉蓋飯呢,就給你澆一份紅燒肉;如果要一份青椒土豆蓋澆飯,就給澆一份青椒土豆絲。蛋炒 飯的好處就是入味均勻,吃起來香。如果恰巧你不愛吃雞蛋,只愛吃青菜的話,那么唯一的辦 法就是全部倒掉,重新做一份青菜炒飯了。蓋澆飯就沒這么多麻煩,你只需要把上面的蓋菜撥 掉,更換一份蓋菜就可以了。蓋澆飯的缺點是入味不均,可能沒有蛋炒飯那么香。到底是蛋炒 飯好還是蓋澆飯好呢?其實這類問題都很難回答,非要比個上下高低的話,就必須設定一個場 景,否則只能說是各有所長。如果大家都不是美食家,沒那么多講究,那么從飯館角度來講的 話,做蓋澆飯顯然比蛋炒飯更有優(yōu)勢,他可以組合出來任意多的組合,而且不會浪費。蓋澆飯 的好處就是"菜""飯"分離,從而提高了制作蓋澆飯的靈活性。飯不滿意就換飯,菜不滿意換菜。用軟件工程的專業(yè)術(shù)語就是"可維護性"比較好,"飯" ??和"菜"的耦合度比較低。蛋炒飯將"蛋"" 飯"攪和在一起,想換"蛋""飯"中任何一種都很困難,耦合度很高,以至于"可維護性"比較差。 軟件工程追求的目標之一就是可維護性,可維護性主要表現(xiàn)在3??個方面:可理解性、可測試性和可修改性。面向?qū)ο蟮暮锰幹痪褪秋@著的改善了軟件系統(tǒng)的可維護性。
對于編程語言來說,基于C??語言的編程是面向過程的,C++只能說一半面向過程一半面向?qū)?/span>象,java 語言就是一門完全面向?qū)ο蟮木幊陶Z言。有C++基礎的同學,學習java 應該很快, 因為 java 底層是 C++語言實現(xiàn)的。當然,除了 java 語言之外,還有很多都是完全面向?qū)ο蟮?/span>
編程語言,例如:C#、Python 等。
對于面向過程和面向?qū)ο蟮睦斫?,目前階段來說還是很難的,畢竟大家現(xiàn)在還停留在只會定義變量,寫個 if 語句階段,慢慢來吧,我們需要不斷的學習后面的內(nèi)容,然后再加深對面向?qū)ο蟮睦斫狻?/span>
?
面向?qū)ο笕筇卣?/strong>
面向?qū)ο缶哂腥筇卣鳎@三大特征目前大家只需要記住,后面我會進行一一講解:
封裝(Encapsulation)
繼承(Inheritance)
多態(tài)(Polymorphism)
任何一門面向?qū)ο蟮木幊陶Z言都具備以上三大特征,例如:python、C#、java 等。
?
類和對象的概念
面向?qū)ο笾阅軌虺蔀橹髁?,那是因為人習慣以對象的方式認識現(xiàn)實世界,例如我說: 老虎。那你大腦中馬上呈現(xiàn)出一個老虎的樣子,對吧。
軟件存在的意義就是為了解決現(xiàn)實世界當中的問題,它必然模擬現(xiàn)實世界,也就是說現(xiàn)實世界中有什么,軟件中就對應有什么。
面向?qū)ο缶幊趟枷胫嘘P(guān)注點是“對象”或者“事物”,那么在編程語言當中要想創(chuàng)建對象則必須先有類,那么類和對象分別是什么,它們的區(qū)別和聯(lián)系是什么呢?
類是現(xiàn)實世界當中具有共同特征的事物進行抽象形成的模板或概念。而對象是實際存在的 個體。例如:“汽車”就是一個類(所有的汽車都有方向盤、發(fā)動機、都能形式,這是它們的 共同特征),“你家的那個汽車”就是一個真實存在的對象?;蛘哒f“明星”是一個類,“劉 德華”就是一個對象。“沈騰”、“趙本山”、“宋丹丹”都是實際存在的對象,他們都屬于 “笑星”類,類描述事物的共同特征,那么“笑星”類都有哪些共同特征呢?笑星類都有姓名、性別、年齡等狀態(tài)信息(屬性),他們還有一個共同的行為就是“演出”(方法)。但當具體到某個對象上之后,我們發(fā)現(xiàn)姓名是不同的,性別是不同的,年齡也是不同的,演出的效果也 是不同的。所以我們在訪問姓名、性別、年齡的時候,必須先有笑星對象,通過真實存在的笑星對象去訪問他的屬性,包括“演出”的時候,只有“笑星”類是不行的,必須先有笑星對象,讓笑星對象去執(zhí)行“演出”這個動作。
通過類可以創(chuàng)建對象,對象又被稱為實例(instance),這個過程也可以稱為實例化。對象
1、2、3 具有共同特征,進行抽象形成了類,所以從對象到類稱為抽象。如下圖所示:

通過以上的描述,我們得知:類 = 屬性 + ?方法,而屬性描述的是狀態(tài),方法描述的是行為動作。行為動作以方法的形式存在,那屬性以什么形式存在呢?
例如:姓名、性別、年齡, 大家想起之前學習的變量了嗎?變量用來存儲數(shù)據(jù)。不錯,對象的屬性以變量形式存在,并且 這里所說的變量是我們之前提過的“成員變量當中的實例變量”。為什么是實例變量呢,實例 變量就是對象級別的變量,這樣的變量要求必須先存在對象,通過對象才能訪問。
例如:“中國人”這個類,有一個屬性是“身份證號”,每一個中國人的“身份證號”都是不一樣的,所 以身份證號必須使用一個真實存在的“中國人對象”來訪問。不能使用“中國人”這個類去訪 問身份證號。一個類可以實例化 N?多個對象,假設通過“中國人”這個類創(chuàng)建了 100?個“中國人對象”,那么“身份證號”必然會有 100 個實例變量空間去存儲。
?
類的發(fā)現(xiàn)和設計
理解了類和對象的概念之后,我們開始進行類的設計,那么,應該怎么在現(xiàn)實世界當中發(fā) 現(xiàn)類呢?例如有這樣的背景:開發(fā)學生選課系統(tǒng),要求能夠單獨對學生信息、課程信息進行維 護,還要求能夠維護某學生選擇某些課程。根據(jù)以上的描述,我們可以看到上面的描述中有很 多名詞,例如:學生、課程等。從這些名詞當中就可以發(fā)現(xiàn)類,例如:學生類、課程類。所有 的學生都有學號、姓名、性別、出生日期等屬性,所有的課程都有課程編號、課程名字等屬性。
如果我們發(fā)現(xiàn)了類,并且發(fā)現(xiàn)了類中的屬性和方法,那么應該以什么形式展現(xiàn)出來呢,在團隊協(xié)作開發(fā)中應該如何讓其他項目組成員知曉你的設計呢,恐怕這個時候就需要使用 UML 了。Unified Modeling Language?(UML)又稱統(tǒng)一建模語言或標準建模語言,是始于 1997 年一個OMG?標準,它是一個支持模型化和軟件系統(tǒng)開發(fā)的圖形化語言,為軟件開發(fā)的所有階段提供模型化和可視化支持,包括由需求分析到規(guī)格,到構(gòu)造和配置。 面向?qū)ο蟮姆治雠c設計(OOA&D,OOAD)方法的發(fā)展在 80 年代末至90 年代中出現(xiàn)了一個高潮,UML 是這個高潮的產(chǎn)物。它不僅統(tǒng)一了 Booch、Rumbaugh 和Jacobson?的表示方法,而且對其作了進一步的發(fā)展, 并最終統(tǒng)一為大眾所接受的標準建模語言。
UML規(guī)范用來描述建模的概念有:類、對象、關(guān)聯(lián)、職責、行為、接口、用例、包、順序、協(xié)作,以及狀態(tài)。
其實軟件開發(fā)和現(xiàn)實生活當中的建造大樓是一樣的,在建造大樓之前需要進行前期的設計,這個時候就需要建筑工程師畫圖紙,圖紙上畫的都是一些符合某些標準的符號,負責建筑的人員一定是能夠看懂這些標準符號的。而UML 就是在軟件開發(fā)方面的一種圖標式語言,程序員在進行系統(tǒng)設計的時候,需要畫出UML 建模圖,程序員根據(jù)UML 建模圖進行開發(fā)。
那么能夠?qū)崿F(xiàn) UML 圖的工具有哪些呢?例如:IBM Rational Rose、PowerDesigner、StarUML、MS Visio 等,我們接下來使用Rational Rose 工具畫一個類出來。請看下圖:

通過以上類圖,我們可以看到一個學生有學號、姓名、年齡、性別屬性,并且有一個考試的方法。其中學號采用整數(shù)型,姓名采用字符串類型,年齡采用整數(shù)型,性別采用布爾型,考試返回值類型設計為浮點型double。
請大家注意,該小節(jié)內(nèi)容屬于了解內(nèi)容,目前還不需要掌握怎么畫這些圖,只要知道從名詞中發(fā)現(xiàn)類,系統(tǒng)開發(fā)初期需要進行類的設計,而設計的時候就需要使用 UML 進行建模,了解幾個常見的建模工具就行了。
類的定義
以上所講內(nèi)容使用java語言完全可以實現(xiàn),因為java語言是一門完全面向?qū)ο蟮木幊陶Z言, 當然,使用其他面向?qū)ο蟮木幊陶Z言也可以實現(xiàn)。當進行了類的設計之后,接下來就可以根據(jù)UML?圖進行代碼的編寫了,在代碼級別上實現(xiàn)一個類,類怎么定義呢?

以上為類的簡單定義,實際上一個完整的類的定義要比以上語法復雜一些,以后再慢慢補 充,先從簡單的開始。 接下來,根據(jù) UML 圖,使用代碼將“學生類”進行實現(xiàn)(只實現(xiàn)屬性),代碼如下圖所示:

以上程序當中 no、name、age、sex 都是屬性,它們都是成員變量中的實例變量,所謂實例變量就是對象級別的變量,這些屬性要想訪問,必須先創(chuàng)建對象才能訪問,不能直接通過類去訪問,因為每一個學生的學號都是不一樣的。沒有學生對象,談何學號!
難點解惑
本章節(jié)的難點主要還是在于概念的理解上,對于一個有 Java 開發(fā)經(jīng)驗的程序員來說也許很簡單,但對于一個從未寫過程序的人來說,簡直是太抽象了,尤其是在開發(fā)中如何發(fā)現(xiàn)類,如何設計類,在這里我想說的是,大家不必過于急躁,類的發(fā)現(xiàn)和設計是需要大家以后不斷的在實戰(zhàn)中積累的,通過不斷的寫項目,慢慢的對面向?qū)ο蟮睦斫鈺絹碓缴钊搿?/span>
小結(jié)
通過本章節(jié)內(nèi)容的學習,需要大家理解類是什么,對象是什么,類和對象有什么區(qū)別。必須要掌握的是要會定義一個類,代碼要會寫。
最后附Java零基礎視頻教程給大家,配合學習效果更佳??!
