程序員高手:凡事皆為對象,你是如何看待面對對象的?

學習面向對象編程,最主要的是要掌握使用面向對象的思想看待問題;

面向對象的思想,就來源於我們現實生活;學習面向對象編程,一定要多想想現實生活,從生活實際中找到答案;

1. 面向對象的引入

需求:計算一個班級的總分;

程序員高手:凡事皆為對象,你是如何看待面對對象的?

需求升級後的問題:

程序員高手:凡事皆為對象,你是如何看待面對對象的?

為了解決這個問題,我們學習了函數,通過將相同功能的代碼抽取到函數中,在需要的時候再調用的方法,就可以解決上面的問題;

程序員高手:凡事皆為對象,你是如何看待面對對象的?

總結:函數就是用來解決程序的複用性差的問題的;

問題升級:如果在多個程序中都出現相同的功能,怎麼辦?

程序員高手:凡事皆為對象,你是如何看待面對對象的?

思考:原來在同一個類中,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年學習的大數據乾貨,包括數據採集。數據存儲和管理。數據處理和分析。數據隱私和安全。雲安全,雲技術,人工智能等資料都有整理,送給每一位大數據小夥伴,這裡是大數據學習者聚集地,歡迎初學和進階中的小夥伴。關注小編頭條號,私信【學習】即可免費領取本文全套資料!


分享到:


相關文章: