學習面向對象編程,最主要的是要掌握使用面向對象的思想看待問題;
面向對象的思想,就來源於我們現實生活;學習面向對象編程,一定要多想想現實生活,從生活實際中找到答案;
1. 面向對象的引入
需求:計算一個班級的總分;
![程序員高手:凡事皆為對象,你是如何看待面對對象的?](http://p2.ttnews.xyz/loading.gif)
需求升級後的問題:
![程序員高手:凡事皆為對象,你是如何看待面對對象的?](http://p2.ttnews.xyz/loading.gif)
為了解決這個問題,我們學習了函數,通過將相同功能的代碼抽取到函數中,在需要的時候再調用的方法,就可以解決上面的問題;
總結:函數就是用來解決程序的複用性差的問題的;
問題升級:如果在多個程序中都出現相同的功能,怎麼辦?
思考:原來在同一個類中,main函數中出現了相同的代碼,為了解決程序複用性差的問題,我們是將相同的代碼抽出來,形成函數,然後在需要的時候調用;
現在是函數重複了,能不能也將重複的函數抽取出來,然後在需要的地方調用?
在函數的定義中說了,函數時定義在類中的,所以也只能抽出來放到一個類中;
問題:將類中的函數抽出到其他類之後,在原來的類中無法直接調用了;到底在一個類中能否調用其他類中的函數呢?
在Java中,可以在一個類中調用其他類的方法;調用的辦法是:
先使用new關鍵字創建一個目標類的對象,然後再原來的類中,通過創建的對象來調用;
格式:
創建一個類的對象:類名 對象名(也是一個變量名、對象的引用) = new 類名();
本例:
Tool tool = new Tool();
調用目標類中的方法:對象名.方法名(參數);
本例:tool.getSum(array);
調用過程:
總結:最後解決問題的方法,就是使用了面向對象的思路;使用面向對象,可以更大程度上解決程序的複用性差的問題;
2. 面向過程和麵向對象
2.1. 面向過程
什麼是過程:
就是做一件事情的先後經過;(也就是先做什麼,後做什麼)
生活中的過程:
泡麵:1、燒開水;2、拆開包裝,將面放進碗中;3、將調料撒到面上;4、倒開水進去,蓋上;5等著泡好,開吃;
程序的過程:
程序中的過程,指的就是程序中代碼執行的過程;
什麼是面向過程:
面向過程,就是一種解決問題的思路;使用這種思路解決問題,我們關心的就是一個問題由那些步驟,然後按照順序先後分別去做;
使用面向過程的思想寫程序,就是先要將需求分析,確認由哪些功能組成,然後分別寫函數實現相應的功能,然後按順序依次調用;
在整個編程過程中,每一步都要開發者自己去做,是參與者;
前幾天寫的程序,就是使用面向過程的方法寫的;
面向過程的好處和弊端:
好處:在需求簡單的時候:思路清晰,程序結構簡單,流程明確;
弊端:如果需求複雜了,因為面對的是非常多的函數功能,真個開發就會非常麻煩,維護也很困難;
面向過程最典型的就是C語言;
2.2. 面向對象
什麼是對象:
指的是實在存在的一個個體;
生活中的對象:
張三李四;電腦;椅子;桌子;水杯;話筒;眼睛;電燈;空氣;太陽;地球……
Java程序中的對象:
就是通過new關鍵字在堆內存中開闢的空間;
什麼是面向對象:
也是一種解決問題的思路;這種思路關心的事情中的參與者;
使用面向對象寫程序,首先也是進行需求分析,看需求由哪些功能組成,然後找有沒有包含已經實現好的函數的類;
如果有,就創建這些類的對象,然後通過對象調用需要的功能;(面向對象的思想)
如果沒有,就要自己創建一個類,然後在類中書寫實現功能的函數(面向過程),然後載創建這個類的對象,通過對象調用;
在實際開發中,絕大多數的功能,都有已經實現好的,開發時直接調用就行了;在開發中,開發者更多的是在調用別人的函數;
面向過程和麵向對象的關係:
面向對象是基於面向過程的;二者不是互相排斥的;
2.3. 面向過程和麵向對象舉例
吃餃子;
面向過程:
1、包餃子:先剁餡;在和麵;包餃子;
2、煮餃子:燒水;下餃子;
3、吃;
4、收拾;
面向對象:
1、直接找一個餃子館;
2、告訴老闆你的需求(口味、數量、付錢,相當於在調用函數時給函數傳參)
3、等著服務員端上(就相當於等待函數的返回結果)
4、吃
2.4. 面向過程和麵向對象的區別
1、關注點不同:
i. 面向過程:關心的是事件中的每一步怎麼做;
ii. 面向對象:關心的是事件中的功能有沒有哪裡已經實現好的;
2、效率不同:
i. 面向過程:因為自己要參與每一步的實現,所以效率比較慢;
ii. 面向對象:因為大多數都是調用別人已經實現好的功能,所以效率比較高;
3、開發質量:
i. 面向過程:因為是自己一步步實現的,大多數情況會有地方會出問題;
ii. 面向對象:因為大多數都是調用別人寫好的功能,而這些功能一般都經過大量的驗證,質量有保證;
4、使用範圍不同:
i. 面向過程:適合解決需求簡單的問題;
ii. 面向對象:更適合解決複雜的需求;
注意:面向對象是基於過程的;
3. 對象在需求中的使用和練習
在使用面向對象的思想解決問題的時候,第一步也是最重要的一步,就是 找對象;
1.1. 需求一:模擬貓抓老鼠;
場景:
1、貓看見老鼠;
2、貓追老鼠;
3、貓抓老鼠;
1、找對象:
名詞提煉法:就是在需求描述的文字中找名詞;
名詞: 貓 老鼠;
對象: 貓 老鼠;
2、偽代碼描述對象:
偽代碼:就是使用自己理解的符號,非java代碼;
偽代碼描述:
3、偽代碼模擬場景:
貓 湯姆 = new 貓();
老鼠 傑瑞 = new 老鼠();
湯姆.看(傑瑞);
湯姆.追(傑瑞);
湯姆.抓(傑瑞);
練習一:人吃餃子;
找對象:
名詞: 人 餃子;
找對象:人 餃子
偽代碼描述對象:
人{
吃(餃子){}
}
餃子{}
場景模擬:
人 小明 = new 人();
餃子 東北水餃 = new 餃子();
小明.吃(東北水餃);
4. 對象在代碼中的體現
5. 對象的內存圖解
總結:對象就是在堆內存空間中開闢的一塊空間;
通過對象調用函數和對象的成員變量,那個對象調用,就找的是那塊內存空間中的值;
6. 類和對象的區別
先有類,才有對象的;對象是根據類創建的;
7. 局部變量和成員變量
7.1. 概念
成員變量: 就是直接定義在類中的變量;
局部變量:就是定義在局部範圍的變量,比如函數中;
7.2. 同名的局部變量和成員變量的使用
在函數中要使用一個變量,會首先在本函數中找,如果沒有定義,再回去類中找成員變量;如果定義了,就優先使用函數中定義的局部變量;
7.3. 區別
1、從定義的位置上:
a) 局部變量:定義在局部範圍,如函數中;
b) 成員變量:直接定義在類中;
2、從內存上看:
a) 局部變量:棧中;
b) 成員變量:堆內存中
3、從生命週期(指的是從分配空間到回收空間)上看:
a) 局部變量:隨著函數進棧執行,開始分配空間;函數出棧,空間被回收;
b) 成員變量:隨著創建對象的時候在堆中分配空間;隨著對象的空間被回收的時候,變量空間也被回收;
4、從使用範圍上:
a) 局部變量:只能在定義它的範圍中使用;
b) 成員變量:可以在定義它的整個類中使用;
5、從初始值上看:
a) 局部變量:沒有默認值,要使用,必須先要初始化賦值;
成員變量:有默認值,不需要先賦值,就可以直接使用;也可以在使用前先賦值;
8. 匿名對象
8.1. 什麼是匿名對象
匿名:沒有名字;
匿名對象:就是沒有名字的對象;
什麼是對象的名字?
我們操作對象,都是通過保存了對象的地址的變量(又叫對象的引用)來進行的;
這個對象的引用就叫做對象的名字;
對象可以有多個名字,所有保存該對象的引用的變量都是對象的名字;
對象也可以沒有名字;
如果一個對象創建出來後,不將地址賦值給任何變量,就是一個匿名對象;
類:Car;
Car car = new Car();
new Car();//匿名對象;
8.2. 匿名對象的侷限
8.3. 匿名對象的應用
1. 引用傳遞和按值傳遞
按值傳遞:
基本數據類型的變量進行傳參,實際傳遞的是存放在變量中的常量值,這種傳參方式叫做按值傳遞;
這種傳參方式,修改一個變量的值,對其他變量都沒有影響;
引用傳遞:
引用類型的變量進行傳參,實際傳遞的是存放在變量中堆內存的地址,這種方式叫做引用傳遞;
這種方式傳參,通過變量操作一個數據,對其他擁有這個引用的變量,都有影響;
我自己是一名從事了5年大數據挖掘,分析開發的工程師,辭職目前在做線上教育講師,創了一個交流 裙,每晚都會在 裙 內直播,今年年初我花了一個月整理了一份最適合2018年學習的大數據乾貨,包括數據採集。數據存儲和管理。數據處理和分析。數據隱私和安全。雲安全,雲技術,人工智能等資料都有整理,送給每一位大數據小夥伴,這裡是大數據學習者聚集地,歡迎初學和進階中的小夥伴。關注小編頭條號,私信【學習】即可免費領取本文全套資料!
閱讀更多 夢黎若戚 的文章