1. 程式人生 > >寫程式碼太難 送快遞也不錯啊

寫程式碼太難 送快遞也不錯啊

 

java零基礎入門-面向物件篇(四) 類和物件 (中)

要把類和物件說清楚,一定要弄清楚他們的聯絡,他們由什麼組成,每個組成部分有什麼用,怎麼用。

這裡有個很關鍵的東西,叫this,我們上篇文章也說過,但是他的存在經常讓初學者雲裡霧裡,好像懂了,會用了,心裡卻又沒底,特別是後面還有個關鍵字叫 super ,這兩兄弟經常存在於各種面試題裡面,攪的人心神不寧,這次我們來把它說清楚,講明白。

再說 this 關鍵字

this的用法很多,搞清楚本質,問題就迎刃而解了,this的本質是什麼?this總是指向呼叫該方法的物件

。這句話描述的十分準確,但是理解起來十分困難,我們來分解一下這句話  this (總是) 指向 (呼叫該方法的) 物件 ,看見沒,this指向的是一個物件!指向是個什麼意思?還記不記得我們前面說的,棧裡面的變數指向堆裡面的物件,變數儲存的是堆裡面物件的地址,那麼this也指向物件,說明this裡面儲存的也是地址?確實,this裡面儲存的還真是個地址。

我們繼續看  指向 (呼叫該方法的) 物件 這句話是什麼意思。this指向了一個物件,那麼它指向的是哪個物件呢?呼叫這個方法的物件,哪個物件在呼叫方法,this就指向哪個物件。OK~完整的理解一下這句話,哪個物件在呼叫方法,this就儲存哪個物件的地址

。看見沒,我們理解一句話,搞得像是在破案一樣,抽絲剝繭,最後找到真相。其實只有當我們瞭解了問題背後的本質的時候,才能找到問題的答案。

除了呼叫方法,this還可以呼叫構造器和成員變數。理解了上面的那句話,這裡就很好理解了,因為this儲存的是物件的地址,this就可以“代替”這個物件,這個物件能呼叫的,this都可以呼叫。

 

this呼叫

要注意的是,其實上面這個寫了this的地方,也是可以省略this的,我寫出來只是方便大家觀察。其實我們在一個類裡面,成員之間互相呼叫,通常來說都是可以省略this的。但是構造器裡面的this就有點不同了。

對於構造器裡面的this,是指正在被建立的那個物件。

 

構造器裡的this

this 關鍵字,其實用的很少,因為要用它的地方都可以省略它...而構造器裡面其實一般使用預設無參構造器就夠了。工作中用this最多的地方就是區域性變數和成員變數重名的時候,用this加以區別,然而,這個過程其實程式設計工具可以幫我們一鍵生成,不需要我們敲鍵盤。但是,面試題裡出現率比較高,所以還是弄清楚比較好。

我們上面說了,呼叫成員變數和方法的時候,會有一個this在前面,不管你寫或不寫,它都在那。但是還有一種成員變數和方法,它前面不是隱藏了this,而是真的沒有this,他們就是靜態變數和靜態方法。

靜態變數

靜態變數就是在定義的時候被 static 修飾的變數。由static修飾的變數和方法都屬於類,不屬於物件

解釋這個問題之前,我們首先來看一個老熟人 —— main 方法。我們前面沒有介紹物件的時候,都是直接執行mian方法,而沒有建立任何物件,而我們介紹物件的時候又介紹物件呼叫方法,這是為什麼?因為我們的main方法是靜態方法,只要有類,就可以執行,因為靜態方法屬於類,不屬於物件。我們以前在練習的時候使用了main方法,可是對main方法前面一堆修飾符缺沒有任何介紹,現在我們的知識儲備已經足夠了,我們來好好講一下main方法。

main方法

1.public 是訪問修飾符,除了public 還有 protected , default, private ,這裡先混個眼熟,具體後面說。

2.static 這個是本篇主角,用來標記該方法是靜態方法。

3.void 是方法的返回值,void表示這個方法不需要返回值。

4.mian 是方法名,此方法叫main。

5.Stirng[] args 是方法引數,表示main方法可以接受 String 陣列型別的引數,main方法的引數是java的執行引數。這個瞭解即可。

什麼是屬於類?什麼是屬於物件?

屬於類就是直接被類呼叫,屬於物件就是直接被物件呼叫

類呼叫

我們看到,我們的main方法是靜態方法,如果在main方法直接呼叫非靜態的成員變數或者方法是直接報錯的,而我們呼叫靜態成員變數是直接使用類名去呼叫。

我們為什麼需要靜態的變數和方法?

其實我們在寫程式碼的過程中,會遇到一個情況,那就是有一些方法是需要重複使用的,比如計算日期,字串的格式化等等,這種方法我們稱為 “工具方法”,我們用一個工具類來封裝這些方法,這種類有個特點,我們並不需要用它來創造物件,再去使用方法,而是直接使用這個工具類中的方法即可完成任務。我知道說了半天,肯定有同學還是不懂,這次我們來送個快遞。

比如我們經常上網購物,我們會收到很多包裹,在我們的賣家發貨的時候會把東西打包,這個場景我們有兩個類,一個是包裹,一個是包裝的工具膠帶。我們的包裹每個都不一樣,裡面可能是不同的商品,也可能是不同的商品數量,但是我們將商品打包後,都會用膠帶這個工具來封包裹,膠帶就可以做成一個工具類,因為我們不管包裹裡面有多少東西,東西是什麼,最後膠帶做的操作都一樣。

 

包裹

首先看包裹,包裹是類,例項是裝好各種商品的包裹,包裹的大小也可能不同。比如我們的包裹有簽收人,大小,商品數量這三個成員變數,每個例項的簽收人,大小和商品數量都是不同的,買了一個商品的就是小包裹,買了幾個商品的包裹就大一點,所以我們要將這三個變數設定成普通的成員變數,讓他們的值跟著例項變化。包裹還有一個方法是收包裹,“多麼激動人心的時刻啊”~

 

膠帶

再看膠帶,我們打包好包裹以後就要貼膠帶了,我們的膠帶有一個成員變數,叫貼幾次,還有一個方法叫貼膠帶。一般貼包裹都是橫著貼一圈,再豎著貼一圈,這樣就行了,每個包裹不管大小,裡面裝的什麼,都跟我貼膠帶沒啥關係,所以這個貼幾次的變數值就是2。正因為他跟物件沒有關係,所以我們完全可以把他設計成屬於類的成員變數和方法,不需要例項,直接使用類來操作。

有同學會問,膠帶是個類也可以例項化啊,也可以有很多種膠帶啊,我來說給你聽,透明膠帶,不透明膠帶,單面膠帶,雙面膠帶...我也可以例項化其中一種來貼箱子啊,為啥非要用類的方法?說的很對,膠帶確實還可以例項化,只要將static修飾符去掉,但是,我們這個具體的場景裡其實只需要把箱子貼兩次就夠了,不關心用什麼膠帶去貼,只要是膠帶就行,我們只需要關心貼這個過程,具體你用什麼來貼都行。所以我們需要的只是膠帶這個類的“貼”方法,而不需要具體到某種膠帶的“貼”方法。而且在使用過程中會帶來很大的便利,不用去例項化物件,何樂而不為?工具這個概念,就是拿來即用,用完就扔,下次再撿起來繼續用...

再來看程式碼,首先是膠帶的類

膠帶類

在理解這個知識點的時候,一定要弄清楚一個關鍵的地方,那就是靜態變數和方法屬於類不屬於物件,如果我們使用物件的方法一定要使用物件去呼叫,使用類方法用類呼叫。其實我們寫程式碼的時候會發現,如果把膠帶這個類例項化,是可以用膠帶生成的物件去呼叫膠帶的靜態變數和方法的,但是強烈不建議這麼做,這樣做會顯得很業餘,就好像你在自己的臉上寫了幾個字——“其實我什麼都不懂”,所以最好不要這麼幹。

再來看包裹的類

包裹類

包裹類裡面是非靜態的成員變數和非靜態方法,因為他們要生成不同的例項物件,所以不能設計成靜態成員和方法。而膠帶不管你傳來的物件是大傻子的包裹還是二愣子的包裹,他都幹同樣的活,所以可以設計成靜態成員和方法。嘴巴說幹了。。。希望各位能夠理解。

前面我們說了一句話

有一種成員變數和方法,它前面不是隱藏了this,而是真的沒有this,他們就是靜態變數和靜態方法。

為什麼?如果你真的理解了this和static,就不用我多說了。

emmmm~~~考慮再三,我還是說吧~ this指向的是物件,static變數不屬於物件屬於類,所以static修飾的不管是成員變數還是方法,前面都沒有this,因為this只跟物件玩,你不屬於物件,抱歉~不跟你玩~

 

類和物件的生命週期

生命週期,是指一個東西從誕生到結束的一個完整的過程,比如一個人從生到死就是一個完整的週期,而我們的軟體也是一樣,它們也是有生命週期的,比如類和物件。

生命週期

 

每一個時期他們可以做的事都不一樣,比如我們在剛出生的時候,肯定不會有哪個傻子跑來問,“哇,好可愛啊,你叫什麼名字啊~”,因為剛出生的時候啥也不知道,怎麼可能回答問題。我們的類和物件也是一樣,在生命週期的不同階段可以做不同的事。

這裡我們講類的生命週期和物件的生命週期是抽象的概括,以後我們知識積累多了我們再展開講。

 

類和物件生命週期

從生命週期的角度看,我們的靜態變數和方法在載入類的時候就可以用了,而非靜態的變數和方法必須要有類的例項,才可以使用。