
java零基礎(chǔ)入門(mén)-面向?qū)ο笃?四) 類和對(duì)象 (中)
要把類和對(duì)象說(shuō)清楚,一定要弄清楚他們的聯(lián)系,他們由什么組成,每個(gè)組成部分有什么用,怎么用。
這里有個(gè)很關(guān)鍵的東西,叫this,我們上篇文章也說(shuō)過(guò),但是他的存在經(jīng)常讓初學(xué)者云里霧里,好像懂了,會(huì)用了,心里卻又沒(méi)底,特別是后面還有個(gè)關(guān)鍵字叫 super ,這兩兄弟經(jīng)常存在于各種面試題里面,攪的人心神不寧,這次我們來(lái)把它說(shuō)清楚,講明白。
再說(shuō) this 關(guān)鍵字
this的用法很多,搞清楚本質(zhì),問(wèn)題就迎刃而解了,this的本質(zhì)是什么?this總是指向調(diào)用該方法的對(duì)象。這句話描述的十分準(zhǔn)確,但是理解起來(lái)十分困難,我們來(lái)分解一下這句話? this (總是) 指向 (調(diào)用該方法的) 對(duì)象 ,看見(jiàn)沒(méi),this指向的是一個(gè)對(duì)象!指向是個(gè)什么意思?還記不記得我們前面說(shuō)的,棧里面的變量指向堆里面的對(duì)象,變量保存的是堆里面對(duì)象的地址,那么this也指向?qū)ο?,說(shuō)明this里面保存的也是地址?確實(shí),this里面保存的還真是個(gè)地址。
我們繼續(xù)看??指向 (調(diào)用該方法的) 對(duì)象 這句話是什么意思。this指向了一個(gè)對(duì)象,那么它指向的是哪個(gè)對(duì)象呢?調(diào)用這個(gè)方法的對(duì)象,哪個(gè)對(duì)象在調(diào)用方法,this就指向哪個(gè)對(duì)象。OK~完整的理解一下這句話,哪個(gè)對(duì)象在調(diào)用方法,this就保存哪個(gè)對(duì)象的地址。看見(jiàn)沒(méi),我們理解一句話,搞得像是在破案一樣,抽絲剝繭,最后找到真相。其實(shí)只有當(dāng)我們了解了問(wèn)題背后的本質(zhì)的時(shí)候,才能找到問(wèn)題的答案。
除了調(diào)用方法,this還可以調(diào)用構(gòu)造器和成員變量。理解了上面的那句話,這里就很好理解了,因?yàn)閠his保存的是對(duì)象的地址,this就可以“代替”這個(gè)對(duì)象,這個(gè)對(duì)象能調(diào)用的,this都可以調(diào)用。

要注意的是,其實(shí)上面這個(gè)寫(xiě)了this的地方,也是可以省略this的,我寫(xiě)出來(lái)只是方便大家觀察。其實(shí)我們?cè)谝粋€(gè)類里面,成員之間互相調(diào)用,通常來(lái)說(shuō)都是可以省略this的。但是構(gòu)造器里面的this就有點(diǎn)不同了。
對(duì)于構(gòu)造器里面的this,是指正在被創(chuàng)建的那個(gè)對(duì)象。

this 關(guān)鍵字,其實(shí)用的很少,因?yàn)橐盟牡胤蕉伎梢允÷运?..而構(gòu)造器里面其實(shí)一般使用默認(rèn)無(wú)參構(gòu)造器就夠了。工作中用this最多的地方就是局部變量和成員變量重名的時(shí)候,用this加以區(qū)別,然而,這個(gè)過(guò)程其實(shí)編程工具可以幫我們一鍵生成,不需要我們敲鍵盤(pán)。但是,面試題里出現(xiàn)率比較高,所以還是弄清楚比較好。
我們上面說(shuō)了,調(diào)用成員變量和方法的時(shí)候,會(huì)有一個(gè)this在前面,不管你寫(xiě)或不寫(xiě),它都在那。但是還有一種成員變量和方法,它前面不是隱藏了this,而是真的沒(méi)有this,他們就是靜態(tài)變量和靜態(tài)方法。
靜態(tài)變量
靜態(tài)變量就是在定義的時(shí)候被 static 修飾的變量。由static修飾的變量和方法都屬于類,不屬于對(duì)象。
解釋這個(gè)問(wèn)題之前,我們首先來(lái)看一個(gè)老熟人 —— main 方法。我們前面沒(méi)有介紹對(duì)象的時(shí)候,都是直接運(yùn)行mian方法,而沒(méi)有創(chuàng)建任何對(duì)象,而我們介紹對(duì)象的時(shí)候又介紹對(duì)象調(diào)用方法,這是為什么?因?yàn)槲覀兊膍ain方法是靜態(tài)方法,只要有類,就可以運(yùn)行,因?yàn)殪o態(tài)方法屬于類,不屬于對(duì)象。我們以前在練習(xí)的時(shí)候使用了main方法,可是對(duì)main方法前面一堆修飾符缺沒(méi)有任何介紹,現(xiàn)在我們的知識(shí)儲(chǔ)備已經(jīng)足夠了,我們來(lái)好好講一下main方法。

1.public 是訪問(wèn)修飾符,除了public 還有 protected ,?default, private ,這里先混個(gè)眼熟,具體后面說(shuō)。
2.static 這個(gè)是本篇主角,用來(lái)標(biāo)記該方法是靜態(tài)方法。
3.void 是方法的返回值,void表示這個(gè)方法不需要返回值。
4.mian 是方法名,此方法叫main。
5.Stirng[] args 是方法參數(shù),表示main方法可以接受 String 數(shù)組類型的參數(shù),main方法的參數(shù)是java的運(yùn)行參數(shù)。這個(gè)了解即可。
什么是屬于類?什么是屬于對(duì)象?
屬于類就是直接被類調(diào)用,屬于對(duì)象就是直接被對(duì)象調(diào)用

我們看到,我們的main方法是靜態(tài)方法,如果在main方法直接調(diào)用非靜態(tài)的成員變量或者方法是直接報(bào)錯(cuò)的,而我們調(diào)用靜態(tài)成員變量是直接使用類名去調(diào)用。
我們?yōu)槭裁葱枰o態(tài)的變量和方法?
其實(shí)我們?cè)趯?xiě)代碼的過(guò)程中,會(huì)遇到一個(gè)情況,那就是有一些方法是需要重復(fù)使用的,比如計(jì)算日期,字符串的格式化等等,這種方法我們稱為 “工具方法”,我們用一個(gè)工具類來(lái)封裝這些方法,這種類有個(gè)特點(diǎn),我們并不需要用它來(lái)創(chuàng)造對(duì)象,再去使用方法,而是直接使用這個(gè)工具類中的方法即可完成任務(wù)。我知道說(shuō)了半天,肯定有同學(xué)還是不懂,這次我們來(lái)送個(gè)快遞。
比如我們經(jīng)常上網(wǎng)購(gòu)物,我們會(huì)收到很多包裹,在我們的賣家發(fā)貨的時(shí)候會(huì)把東西打包,這個(gè)場(chǎng)景我們有兩個(gè)類,一個(gè)是包裹,一個(gè)是包裝的工具膠帶。我們的包裹每個(gè)都不一樣,里面可能是不同的商品,也可能是不同的商品數(shù)量,但是我們將商品打包后,都會(huì)用膠帶這個(gè)工具來(lái)封包裹,膠帶就可以做成一個(gè)工具類,因?yàn)槲覀儾还馨锩嬗卸嗌贃|西,東西是什么,最后膠帶做的操作都一樣。

首先看包裹,包裹是類,實(shí)例是裝好各種商品的包裹,包裹的大小也可能不同。比如我們的包裹有簽收人,大小,商品數(shù)量這三個(gè)成員變量,每個(gè)實(shí)例的簽收人,大小和商品數(shù)量都是不同的,買(mǎi)了一個(gè)商品的就是小包裹,買(mǎi)了幾個(gè)商品的包裹就大一點(diǎn),所以我們要將這三個(gè)變量設(shè)置成普通的成員變量,讓他們的值跟著實(shí)例變化。包裹還有一個(gè)方法是收包裹,“多么激動(dòng)人心的時(shí)刻啊”~

再看膠帶,我們打包好包裹以后就要貼膠帶了,我們的膠帶有一個(gè)成員變量,叫貼幾次,還有一個(gè)方法叫貼膠帶。一般貼包裹都是橫著貼一圈,再豎著貼一圈,這樣就行了,每個(gè)包裹不管大小,里面裝的什么,都跟我貼膠帶沒(méi)啥關(guān)系,所以這個(gè)貼幾次的變量值就是2。正因?yàn)樗鷮?duì)象沒(méi)有關(guān)系,所以我們完全可以把他設(shè)計(jì)成屬于類的成員變量和方法,不需要實(shí)例,直接使用類來(lái)操作。
有同學(xué)會(huì)問(wèn),膠帶是個(gè)類也可以實(shí)例化啊,也可以有很多種膠帶啊,我來(lái)說(shuō)給你聽(tīng),透明膠帶,不透明膠帶,單面膠帶,雙面膠帶...我也可以實(shí)例化其中一種來(lái)貼箱子啊,為啥非要用類的方法?說(shuō)的很對(duì),膠帶確實(shí)還可以實(shí)例化,只要將static修飾符去掉,但是,我們這個(gè)具體的場(chǎng)景里其實(shí)只需要把箱子貼兩次就夠了,不關(guān)心用什么膠帶去貼,只要是膠帶就行,我們只需要關(guān)心貼這個(gè)過(guò)程,具體你用什么來(lái)貼都行。所以我們需要的只是膠帶這個(gè)類的“貼”方法,而不需要具體到某種膠帶的“貼”方法。而且在使用過(guò)程中會(huì)帶來(lái)很大的便利,不用去實(shí)例化對(duì)象,何樂(lè)而不為?工具這個(gè)概念,就是拿來(lái)即用,用完就扔,下次再撿起來(lái)繼續(xù)用...
再來(lái)看代碼,首先是膠帶的類

在理解這個(gè)知識(shí)點(diǎn)的時(shí)候,一定要弄清楚一個(gè)關(guān)鍵的地方,那就是靜態(tài)變量和方法屬于類不屬于對(duì)象,如果我們使用對(duì)象的方法一定要使用對(duì)象去調(diào)用,使用類方法用類調(diào)用。其實(shí)我們寫(xiě)代碼的時(shí)候會(huì)發(fā)現(xiàn),如果把膠帶這個(gè)類實(shí)例化,是可以用膠帶生成的對(duì)象去調(diào)用膠帶的靜態(tài)變量和方法的,但是強(qiáng)烈不建議這么做,這樣做會(huì)顯得很業(yè)余,就好像你在自己的臉上寫(xiě)了幾個(gè)字——“其實(shí)我什么都不懂”,所以最好不要這么干。
再來(lái)看包裹的類

包裹類里面是非靜態(tài)的成員變量和非靜態(tài)方法,因?yàn)樗麄円刹煌膶?shí)例對(duì)象,所以不能設(shè)計(jì)成靜態(tài)成員和方法。而膠帶不管你傳來(lái)的對(duì)象是大傻子的包裹還是二愣子的包裹,他都干同樣的活,所以可以設(shè)計(jì)成靜態(tài)成員和方法。嘴巴說(shuō)干了。。。希望各位能夠理解。
前面我們說(shuō)了一句話
有一種成員變量和方法,它前面不是隱藏了this,而是真的沒(méi)有this,他們就是靜態(tài)變量和靜態(tài)方法。
為什么?如果你真的理解了this和static,就不用我多說(shuō)了。
emmmm~~~考慮再三,我還是說(shuō)吧~ this指向的是對(duì)象,static變量不屬于對(duì)象屬于類,所以static修飾的不管是成員變量還是方法,前面都沒(méi)有this,因?yàn)閠his只跟對(duì)象玩,你不屬于對(duì)象,抱歉~不跟你玩~
類和對(duì)象的生命周期
生命周期,是指一個(gè)東西從誕生到結(jié)束的一個(gè)完整的過(guò)程,比如一個(gè)人從生到死就是一個(gè)完整的周期,而我們的軟件也是一樣,它們也是有生命周期的,比如類和對(duì)象。

每一個(gè)時(shí)期他們可以做的事都不一樣,比如我們?cè)趧偝錾臅r(shí)候,肯定不會(huì)有哪個(gè)傻子跑來(lái)問(wèn),“哇,好可愛(ài)啊,你叫什么名字啊~”,因?yàn)閯偝錾臅r(shí)候啥也不知道,怎么可能回答問(wèn)題。我們的類和對(duì)象也是一樣,在生命周期的不同階段可以做不同的事。
這里我們講類的生命周期和對(duì)象的生命周期是抽象的概括,以后我們知識(shí)積累多了我們?cè)僬归_(kāi)講。

從生命周期的角度看,我們的靜態(tài)變量和方法在加載類的時(shí)候就可以用了,而非靜態(tài)的變量和方法必須要有類的實(shí)例,才可以使用。