面向過程和面向?qū)ο蟮膮^(qū)別:
經(jīng)常聽到有人說,計(jì)算機(jī)語言可以歸為面向過程語言和面向?qū)ο笳Z言秧秉,那么到底什么是面向?qū)ο笪坭耄裁词敲嫦蜻^程呢?
答:面向過程就是分析出解決問題所需要的步驟书幕,然后用函數(shù)把這些步驟一步一步實(shí)現(xiàn)新荤,使用的時(shí)候一個(gè)一個(gè)依次調(diào)用就可以了;面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個(gè)對(duì)象台汇,建立對(duì)象的目的不是為了完成一個(gè)步驟苛骨,而是為了描敘某個(gè)事物在整個(gè)解決問題的步驟中的行為。
可以拿生活中的實(shí)例來理解面向過程與面向?qū)ο蠊赌牛缥遄悠逖髦ィ嫦蜻^程的設(shè)計(jì)思路就是首先分析問題的步驟:1、開始游戲牵素,2严衬、黑子先走,3两波、繪制畫面瞳步,4闷哆、判斷輸贏,5单起、輪到白子抱怔,6、繪制畫面嘀倒,7屈留、判斷輸贏,8测蘑、返回步驟2灌危,9、輸出最后結(jié)果碳胳。把上面每個(gè)步驟用不同的方法來實(shí)現(xiàn)勇蝙。
如果是面向?qū)ο蟮脑O(shè)計(jì)思想來解決問題。面向?qū)ο蟮脑O(shè)計(jì)則是從另外的思路來解決問題挨约。整個(gè)五子棋可以分為1味混、黑白雙方,這兩方的行為是一模一樣的诫惭,2翁锡、棋盤系統(tǒng),負(fù)責(zé)繪制畫面夕土,3馆衔、規(guī)則系統(tǒng),負(fù)責(zé)判定諸如犯規(guī)怨绣、輸贏等角溃。第一類對(duì)象(玩家對(duì)象)負(fù)責(zé)接受用戶輸入,并告知第二類對(duì)象(棋盤對(duì)象)棋子布局的變化梨熙,棋盤對(duì)象接收到了棋子的變化就要負(fù)責(zé)在屏幕上面顯示出這種變化开镣,同時(shí)利用第三類對(duì)象(規(guī)則系統(tǒng))來對(duì)棋局進(jìn)行判定刀诬。
可以明顯地看出咽扇,面向?qū)ο笫且?b>功能來劃分問題,而不是步驟陕壹。同樣是繪制棋局质欲,這樣的行為在面向過程的設(shè)計(jì)中分散在了多個(gè)步驟中,很可能出現(xiàn)不同的繪制版本糠馆,因?yàn)橥ǔTO(shè)計(jì)人員會(huì)考慮到實(shí)際情況進(jìn)行各種各樣的簡化嘶伟。而面向?qū)ο蟮脑O(shè)計(jì)中,繪圖只可能在棋盤對(duì)象中出現(xiàn)又碌,從而保證了繪圖的統(tǒng)一九昧。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——摘自《C#編程詞典》
車開動(dòng)去新疆绊袋,車開動(dòng)的這個(gè)方法應(yīng)該寫在車?yán)镞€是司機(jī)里呢?應(yīng)該寫在車?yán)镏ィ驗(yàn)閷?duì)于車開動(dòng)這個(gè)過程癌别,車本身比司機(jī)更加了解其中的過程,因此方法應(yīng)該寫在最直接擁有的類中
????????對(duì)象的作用域? 可以存活在{}之外蹋笼,但是引用它的變量只能存活在{}之內(nèi)展姐,不被引用的對(duì)象,java的垃圾回收(GC)起會(huì)判斷其實(shí)無用的剖毯,然后釋放這些對(duì)象的內(nèi)存空間圾笨,可以理解為如果引用死了,對(duì)象就要跟著殉情...但是你根本確定不了什么時(shí)候回收沒有引用的對(duì)象
面向?qū)ο髢?yōu)勢:加功能不用更改以前程序逊谋、動(dòng)態(tài)分配內(nèi)存
把類之間的調(diào)用想象成類之間的交談
面向?qū)ο笳Z言的五個(gè)基本特性:
(1)萬物皆對(duì)象:將對(duì)象視為奇特的變量擂达,它可以存儲(chǔ)數(shù)據(jù)。也可對(duì)自身進(jìn)行操作胶滋,理論上可以抽取任何物體將其表示為程序中的對(duì)象谍婉,其實(shí)可以把基本類型也看成是是對(duì)象,只是它們使用了一個(gè)更簡潔的初始化方式镀钓,創(chuàng)建一個(gè)并非是引用的“自動(dòng)”變量穗熬,直接存儲(chǔ)值
(2)程序是對(duì)象的集合,它們通過發(fā)送消息告知彼此要做的丁溅,要想請(qǐng)求一個(gè)對(duì)象唤蔗,就必須對(duì)該對(duì)象發(fā)送一條消息,也就是對(duì)某個(gè)特定對(duì)象的調(diào)用請(qǐng)求(對(duì)象先創(chuàng)建后使用)
(3)每個(gè)對(duì)象都有自己的由其他對(duì)象所構(gòu)成的存儲(chǔ):可以將一個(gè)對(duì)象放到另一個(gè)對(duì)象之中窟赏,構(gòu)成復(fù)雜模型
(4)每個(gè)對(duì)象都擁有其類型:每個(gè)對(duì)象都是一個(gè)類的實(shí)例
(5)某一特定對(duì)象的所有對(duì)象都可以接收同樣信息:比如圓形類型的對(duì)象同時(shí)是幾何類型的對(duì)象妓柜,所以一個(gè)圓形對(duì)象必然能接受到發(fā)送給幾何形對(duì)象的消息,也就是擁有其屬性和方法涯穷。
(6)面向?qū)ο蟮哪繕?biāo)就是去創(chuàng)建能夠提供理想的服務(wù)來解決問題的一系列對(duì)象棍掐。
思維方式:將問題從表象中抽取出來,思考什么樣的對(duì)象可以馬上解決問題
類與對(duì)象的關(guān)系
類是構(gòu)造對(duì)象的模板或藍(lán)圖拷况,類是一個(gè)抽象的作煌,實(shí)例化成具體東西后變成對(duì)象。類指的是一類東西赚瘦,而對(duì)象指的是具體東西粟誓,比如狗是一個(gè)類,而具體的一條狗就是一個(gè)對(duì)象起意。
類描述了具有相同特性(數(shù)據(jù)類型)和行為(功能)的集合鹰服,由此可以把它看做是一個(gè)數(shù)據(jù)類型
類的創(chuàng)建(類對(duì)應(yīng)名詞,名詞里的狀態(tài)名詞表示屬性,方法對(duì)應(yīng)動(dòng)詞悲酷,比如狗是個(gè)名詞表示一個(gè)類套菜,狗的狀態(tài)比如狗的名字,狗的年齡表示屬性设易,狗會(huì)跑就是一個(gè)動(dòng)作表示方法)
<修飾符>class<類名>{
<屬性(狀態(tài))>
<構(gòu)造方法>
<普通方法>
}
構(gòu)造器(構(gòu)造方法)
對(duì)類進(jìn)行初始化? ? 語法:修飾符? 類名(參數(shù)){? }? 讓對(duì)象在創(chuàng)建的時(shí)候有初始值
(1)與類名相同笼踩,不可寫返回值,在new時(shí)被調(diào)用亡嫌。
(2)每個(gè)類自帶一個(gè)無參構(gòu)造器嚎于,賦默認(rèn)值,引用類型為null挟冠,若寫了一個(gè)構(gòu)造器于购,無參構(gòu)造器會(huì)變成不合法,若想使用無參構(gòu)造器需要手動(dòng)寫一個(gè)(每個(gè)類最好有一個(gè)無參構(gòu)造器)知染。
(3)構(gòu)造函數(shù)參數(shù)是什么類型肋僧,對(duì)象傳參時(shí)就是什么類型,若想傳入Animals型控淡,則構(gòu)造函數(shù)參數(shù)為Animals型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
(4)構(gòu)造代碼塊{? }是給對(duì)象用的(成員方法嫌吠,成員函數(shù)),在執(zhí)行父類構(gòu)造方法后執(zhí)行子類構(gòu)造代碼塊掺炭,不管執(zhí)行哪個(gè)構(gòu)造函數(shù)辫诅,都會(huì)先執(zhí)行構(gòu)造代碼塊,構(gòu)造代碼塊在構(gòu)造函數(shù)執(zhí)行前執(zhí)行涧狮。父構(gòu)造代碼塊炕矮,父構(gòu)造函數(shù),子構(gòu)造代碼塊者冤,子構(gòu)造函數(shù)
對(duì)象創(chuàng)建
Animal xb=new Animals()肤视;(創(chuàng)建對(duì)象new+構(gòu)造方法(構(gòu)造器)調(diào)用類的構(gòu)造器)
xb是引用對(duì)象的一個(gè)變量相當(dāng)于遙控器,而對(duì)象相當(dāng)于電視機(jī)涉枫,只要能握住這個(gè)遙控器邢滑,就能保持與電視機(jī)的相連。? new可以表示給我一個(gè)新對(duì)象愿汰,而Animals表示的是這個(gè)引用可以引用什么對(duì)象困后。
狀態(tài)(實(shí)例變量):內(nèi)部數(shù)據(jù),描述對(duì)象的特征的信息
行為:方法
標(biāo)識(shí):每個(gè)對(duì)象都有唯一的標(biāo)識(shí)和其它對(duì)象區(qū)分開尼桶,就是每個(gè)對(duì)象在內(nèi)存中都有唯一的地址
訪問對(duì)象成員:xb.color 屬性? xb.run()方法
對(duì)象創(chuàng)建步驟
1.將Animals.class加載進(jìn)內(nèi)存
2.棧內(nèi)存分配一個(gè)xb變量的空間?
3堆內(nèi)存分配空間操灿,創(chuàng)建對(duì)象,提供對(duì)象地址(對(duì)象存在堆內(nèi)泵督,更具對(duì)象大小分配空間,虛擬機(jī)覺察對(duì)象不用時(shí)自動(dòng)回收 )
4.對(duì)對(duì)象屬性進(jìn)行初始化
5.調(diào)用構(gòu)造方法對(duì)對(duì)象初始化? 對(duì)象被使用前取得對(duì)象遙控器庶喜,對(duì)對(duì)象進(jìn)行改變
6.將對(duì)象內(nèi)存地址賦給給xb指向?qū)ο笮±埃椒▽?duì)象的多次使用救鲤。.(堆上的對(duì)象不被引用會(huì)變成無用)
如果要處理聯(lián)系人的數(shù)據(jù)更新
? ? ? ? 應(yīng)該創(chuàng)建數(shù)組將每一個(gè)聯(lián)系人的對(duì)象放進(jìn)去,雖然這樣占的內(nèi)容比較多秩冈,但是這樣可以隨時(shí)獲取每一個(gè)人聯(lián)系人本缠,如果直接建立多個(gè)聯(lián)系人對(duì)象,雖然省內(nèi)存入问,但是只有一個(gè)數(shù)據(jù)引用丹锹,引用的總是最后一個(gè)創(chuàng)建的對(duì)象,不能獲取以前的聯(lián)系人
例:創(chuàng)建5個(gè)Person對(duì)象芬失,保存到數(shù)組里楣黍,想要實(shí)現(xiàn)根據(jù)id查找到Person的信息,這時(shí)因?yàn)橐?b>對(duì)Person對(duì)象進(jìn)行操縱棱烂,所以必須創(chuàng)建另一個(gè)類租漂,人員管理類。
對(duì)一個(gè)類進(jìn)行操縱是在另一個(gè)類中進(jìn)行的這也就是以后所說的has-a關(guān)系颊糜。