目錄
二、簡單理解面向對象
四、對象和類的概念
一、面向過程的思想和面向對象的思想
面向對象和面向過程的思想有著本質上的區別, 作為面向對象的思維來說,當你拿到一個問題時,你分析這個問題不再是第一步先做什么,第二步再做什么,這是面向過程的思維,你應該分析這個問題里面有哪些類和對象,這是第一點,然后再分析這些類和對象應該具有哪些屬性和方法。這是第二點。最后分析類和類之間具體有什么關系,這是第三點。
面向對象有一個非常重要的設計思維:合適的方法應該出現在合適的類里面
二、簡單理解面向對象
就是在程序里面首先分解出來的應該是注意不再是一步一步的過程了,而是首先考慮在這個問題域里面或者程序里面應該具有有哪些對象,所以從現在開始考慮任何問題腦子里不要再想著我實現這件事我第一步應該干什么,第二步應該干什么,如果這樣想,那就是面向過程的思維了。面向對象的思維是,當我碰到這個問題域的時候,碰到這個程序的時候,我首先應該把這個問題里有哪些對象,對象與對象之間有什么關系抽象出來。
三、面向對象的設計思想
面向對象的基本思想是,從現實世界中客觀存在的事物出發來構造軟件系統,并在系統的構造中盡可能運用人類的自然思維方式。
面向對象更加強調運用人類在日常生活的邏輯思維中經常采用的思想方法與原則,如抽象、分類,繼承、聚合、多態等。
人在思考的時候,首先眼睛里看到的是一個一個的對象。
四、對象和類的概念
對象是用于計算機語言對問題域中事物的描述,對象通過“屬性(attribute)”和“方法(method)”來分別對應事物所具有的靜態屬性和動態屬性。
類是用于描述同一類的對象的一個抽象的概念,類中定義了這一類對象所具有的靜態屬性和動態屬性
類可以看成一類對象的模板,對象可以看成該類的一個具體實例。
eg.什么叫瓶子?
瓶子的定義:具有某些類特征的東西就是瓶子,比分說什么樣的形狀,比方說有個口,能倒水,能裝水,一般有個蓋等等。給瓶子下定義的過程,其實就是把瓶子里的某些東西抽象出來了,所以瓶子在這里是叫做一類事物的一個抽象,在你腦子里有瓶子的概念,可瓶子的概念在你腦子里到底是什么呢?瓶子的概念在你腦子里叫做一類事物的一個抽象。怎么抽象的呢?你往往抽象的是這兩個方面:第一個方面我們叫它靜態的屬性,瓶子應該具有哪些特征,比分說瓶子應有個口,這是它的具有的一個靜態屬性,瓶子一般有一個蓋,這也是它的具有一個靜態屬性,除此之外,你還可能給它總結動態的屬性,什么動態的屬性呢?比放說瓶子能倒水,這是它的動態屬性。瓶子這個概念在你腦子里如果你細細的思維的話,其實你給它做了兩方面的總結,一方面是靜態的,一方面是動態的。反映到JAVA的類上,一個就是成員變量(靜態屬性),一個就是方法(動態屬性)方法是可以執行的,可以動的。成員變量是某一個類的靜態屬性。所以你腦子里瓶子的概念實際上是一類事物的一個抽象,這種東西我們叫它類,椅子是類,桌子是類,學生是類。什么是對象呢?這一類事物的具體的某個實例就叫做對象。所以一類事物的具體的某一個東西,符合這類事物具體的特征的某個東西就叫做對象。瓶子是一個類,某個瓶子就是瓶子這個類里面的一個對象。
五、如何抽象出一個類?
有兩個方面,一方面是它的靜態屬性,另一方面是它的動態屬性。反映到JAVA里面的類怎么包裝它呢?一方面成員變量,另一方面是方法。
eg.職員這個類該怎么抽象出來?也是從兩個方面,一方面是它的靜態屬性,另一方面它的動態屬性
職員有哪些屬性呢?有姓名,年齡,目前工資數額等屬性,他有哪些方法呢?讓這個職員來顯示姓名,顯示年齡,修改姓名,領取工資。當然顯示姓名,顯示年齡,修改姓名,領取工資這些也可以讓別人來做,但面向對象的設計思維是最合適的方法應該出現在最合適的類里面。顯示姓名,顯示年齡,修改姓名,領取工資由誰來做更合適呢,那就是職員自己最合適。所以這些方法應該出現在職員這個類里面。
對于類來說,它有一些屬性或者稱為成員變量,以后說屬性或者成員變量指的是同一回事。具體的對象他有沒有相關的一些屬性或者叫成員變量呢?有,每一個人都有一份,只不過是取值不同而已。如從職員這個類實例化出來的兩個職員:職員A和職員B,他們都有姓名,年齡,目前工資數額這些屬性,但他們的名字,年齡,領取的工資數額都不一樣。這樣就能把職員A和職員B區分開來了,正是因為他們的屬性值不一樣,所以這個對象才能和另外的對象區分開來,所以通過屬性是可以區分兩個對象的。貓是一個類,這只貓是一個對象,這只貓和另外一只貓該怎么區分開來呢?那就得看你的貓這個類是怎么定義的了,貓有貓毛,毛有顏色。OK,這只貓是黑貓,另一只貓是白貓,這樣通過貓毛的顏色區分開來了。如果只定義一個,如捉老鼠,白貓也能捉,黑貓也能捉,這樣就沒辦法區分出黑貓和白貓了,所以根據方法是沒辦法區分兩個對象的。所以每個對象都有自己的屬性,屬性值和另外一個對象一般是不一樣的。
一定要區分類和對象,什么叫做類?什么叫做對象?類是一類事物的一個抽象,具有共同特征的一類事物的一個抽象。對象是這個類具體的某一個實例,所以以后說實例(instance)或者說對象(object)指的是同一回事。
六、類(對象)之間的關系
一.關聯關系(最弱的一種關系)
類和類之間是有關系的,如學生和老師這兩個類,老師可以教學生,學生可以向老師學習。這就是他們之間的關系。關系和關系之間是不同的,你和你老婆的關系和你和你其他女朋友的關系是不能混為一談的。關系最弱的一種關系叫關聯關系。關聯關系反應到代碼上往往是一個類的方法里面的參數是另一個類的具體的某一個對象,比如教授教研究生,教哪個研究生,教是教授這個類里面的一個方法,某個研究生是研究生這個類里面的一個具體的對象。關聯關系是最弱的一種關系,咱們兩個類之間有關系,或者兩個對象之間有關系,但關系不是很緊密。
二.繼承關系(比較強的一種關系)
繼承關系封裝了這樣一種邏輯:“XX是一種XX”,只要這東西能說通了,就可以考慮用繼承關系來封裝它。如:游泳運動員從運動員繼承,游泳運動員是一種運動員,這能說得通,所以游泳運動員就是從運動員繼承過來的,游泳運動員和運動員就是一種繼承關系。學生是一個人,學生從人繼承,老師是一個人,老師也從人繼承,學生是一種老師,這說不通,所以學生和老師就不存在繼承關系。所以將來做設計的時候要分清繼承關系很簡單,你只要說通這么一句話:“XX是一種XX”。OK,那他們之間就是繼承關系。籃球運動員是一種球類運動員,這說得通,所以籃球運動員從球類運動員繼承,這樣繼承很有可能會產生一棵繼承樹,運動員派生出來,派生出來的意思是游泳運動員這個類、球類運動員這個類、射擊運動員類從它繼承,相當于運動員派生出來了這些個不同的運動員,包括游泳的,球類的,射擊的。球類的再派生足球的,籃球的,排球的。這就是一棵繼承樹,不過這棵樹是比較理想化的情況,只有一個根節點。但實際當中,我們真實世界當中的繼承關系不一定只從一個類繼承,一個類可能從多個類繼承過來,比如說:金絲猴從動物這個類繼承,這很正常,但我還有另外一個專門的類:“應該受到保護的東西”,這也是一個類,金絲猴應該受到保護,所以金絲猴是一種應該受到保護的東西。所以金絲猴從“應該受到保護的東西”這個類繼承過來。所以在現實情況當中,一個類完完全全有可能從多個不同的類繼承,C++正是因為想封裝這種繼承關系,所以C++存在多重繼承。
三.聚合關系(整體和部分)(比較強的一種關系)
什么是聚合?聚合就是一個整體與部分的關系。我們說“XX是XX的一部分”,只要說得通,那么他們之間的關系就是聚合關系,隊長是球隊的一部分,隊員是球隊的一部分。所以隊長和球隊是聚合關系,隊員和球隊也是聚合關系。腦袋是人的以部分,身體和胳膊也是人的一部分,因此腦袋,身體和胳膊與人都是聚合關系。聚合關系分得再細一點的話就可以分成聚集關系和組合關系,比如球隊、隊長,隊員,這三者是聚集關系,假如這個隊長既是足球的隊長,同時也是籃球的隊長,一個人分屬兩個不同的球隊,這是可以的,球隊與隊長之間沒有我離不了你,你離不了我這種情況,所以如果分得更細的話,這種就叫做聚集關系。還有一種情況叫組合,組合說的是咱們倆密不可分,我是你必不可少的一部分。一個人的腦袋不可能既屬于你又屬于別人,身體也一樣,不可能既屬于你又屬于別人。所以你的身體,腦袋和你是密不可分的,這是一種更加嚴格的聚合關系,專門給它取了個名字叫組合。
四.實現關系
作為父類來說,我覺得我應該具有這樣一個方法,但我不知道怎么去實現,誰去實現,我的子類去實現,這就是實現關系。和實現關系息息相關的還有一種關系叫多態。
五.多態
七、Java與面向對象
對象和類是分不開的,必須首先定義類才能有對象。首先定義方法才能調用。對象是JAVA里面的核心,做任何東西你首先都得給我造出一個對象才能做。靜態屬性簡稱屬性,也叫成員變量,以后說屬性或者說成員變量它們指的都是同一回事。
整個類可以看作是靜態的屬性還有方法他們之間的一個綜合。怎么抽象出一個類的概念,還是那句話,你必須抽象出兩個方面來,第一方面是看他們的靜態屬性,他們有哪些成員變量,第二方面是看他們的有哪些方法。
寫JAVA程序時,我們一上來寫的就是public class(聲明一個類),在這個class里面我們寫的是成員變量和方法。
每一個JAVA里面的class(類)都對應了我們現實生活中某一類事物的一個抽象。比如說要在JAVA里面封裝一只狗,具體怎么封裝,如何寫代碼,代碼如下:
1 package cn.javastudy.summary; 2 /** 3 * 一類事物封裝到JAVA里面首先得寫class,定義這個類,類名是什么可以自己取。 4 * 這里把類名叫做Dog 5 */ 6 public class Dog { 7 /** 8 * 接下來就是寫這個狗這個類的屬性或者叫成員變量, 9 * 比如說狗這個類的毛的顏色,怎么定義這個屬性呢, 10 * 首先得定義毛的一個類型,如使用int來定義毛的顏色類型 11 */ 12 int furcolor; //定義屬性:毛的顏色 13 float height; //定義屬性:狗的高度 14 float weight; //定義屬性:狗的體重 15 16 /** 17 * 狗的顏色,高度,體重這些屬性定義完了,接下來要定義的就是方法了。 18 * 如寫一個CatchMouse()方法,捉老鼠的方法。 19 * CatchMouse這個方法里面有一個對象類型的參數,捉哪一只老鼠,這個對象參數是屬于Mouse這個類的 20 * @param m 21 */ 22 void CatchMouse(Mouse m){ 23 //在方法體內寫捉老鼠這個過程,怎么捉,跑著捉,走著捉 24 System.out.println("我捉到老鼠了,汪汪!,老鼠要尖叫了!"); 25 /** 26 * 老鼠尖叫一聲,表示被狗咬到了,咬到了能不叫嗎,很自然而然地想到, 27 * 尖叫(scream())這個方法是屬于Mouse這個類里面的某一個方法。 28 * 老鼠自己調用它,讓它自己尖叫。這就是面向對象的思維。 29 */ 30 m.scream(); 31 } 32 33 public static void main(String[] args) { 34 Dog d = new Dog();//首先用new關鍵字創建一只狗 35 Mouse m=new Mouse();//造出一只老鼠。 36 d.CatchMouse(m);//然后用這只狗去抓老鼠,讓狗調用CatchMouse()方法去捉某只老鼠。 37 } 38 }
1 package cn.javastudy.summary; 2 /** 3 * 封裝的老鼠類 4 */ 5 public class Mouse { 6 /** 7 * 老鼠自己有一個發出尖叫的方法 8 * 當被狗咬到時就會發出尖叫 9 */ 10 public void scream() { 11 System.out.println("我被狗咬到了,好痛啊!"); 12 } 13 14 }
從這個意義上來講,JAVA里面的每定義一個類實際上就相當于一種新的數據類型。就跟int ,float, String等一樣,不過是一種新定義的類型而已。
八、為什么使用面向對象編程?
面向對象編程:一組對象互相配合通過溝通完成特定功能
做軟件苦苦追求的一種境界是可重用性(reusable),可擴展性。如果是面向過程,一般情況是屬性和方法它們是分開的,他們不是聚合的關系,不是合在一起的,這樣要復用起來比較麻煩,復用的層次只是局限于方法這個層次上,而面向對象則不同,它是把屬性和方法綜合在一個里面。綜合在一起復用的時候是整個對象進行復用。所以面向對象和面向過程相比,前者更加容易讓我們達到可重用性。
文章列表
留言列表