java基礎學習總結——面向對象

目錄

一. 面向過程的思想和麪向對象的思想

二 .簡單理解面向對象

三、面向對象的設計思想

四、對象和類的概念

五、如何抽象出一個類?

六、類(對象)之間的關係

七、Java與面向對象

八、爲什麼使用面向對象編程?

一、面向過程的思想和麪向對象的思想

       面向對象和麪向過程的思想有着本質上的區別, 作爲面向對象的思維來說,當你拿到一個問題時,你分析這個問題不再是第一步先做什麼,第二步再做什麼,這是面向過程的思維,你應該分析這個問題裏面有哪些類和對象,這是第一點,然後再分析這些類和對象應該具有哪些屬性和方法。這是第二點。最後分析類和類之間具體有什麼關係,這是第三點。

      面向對象有一個非常重要的設計思維:合適的方法應該出現在合適的類裏面

二、簡單理解面向對象

  就是在程序裏面首先分解出來的應該是注意不再是一步一步的過程了,而是首先考慮在這個問題域裏面或者程序裏面應該具有有哪些對象,所以從現在開始考慮任何問題腦子裏不要再想着我實現這件事我第一步應該幹什麼,第二步應該幹什麼,如果這樣想,那就是面向過程的思維了。面向對象的思維是,當我碰到這個問題域的時候,碰到這個程序的時候,我首先應該把這個問題裏有哪些對象,對象與對象之間有什麼關係抽象出來。

三、面向對象的設計思想

  面向對象的基本思想是,從現實世界中客觀存在的事物出發來構造軟件系統,並在系統的構造中儘可能運用人類的自然思維方式。

  面向對象更加強調運用人類在日常生活的邏輯思維中經常採用的思想方法與原則,如抽象、分類,繼承、聚合、多態等。

  人在思考的時候,首先眼睛裏看到的是一個一個的對象。

四、對象和類的概念

     對象是用於計算機語言對問題域中事物的描述,對象通過“屬性(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),可擴展性。如果是面向過程,一般情況是屬性和方法它們是分開的,他們不是聚合的關係,不是合在一起的,這樣要複用起來比較麻煩,複用的層次只是侷限於方法這個層次上,而面向對象則不同,它是把屬性和方法綜合在一個裏面。綜合在一起複用的時候是整個對象進行復用。所以面向對象和麪向過程相比,前者更加容易讓我們達到可重用性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章