堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系
前言:上一篇中我們介紹了new關(guān)鍵字?點(diǎn)擊打開(kāi)鏈接,new一個(gè)類(lèi),實(shí)際上就是調(diào)用該類(lèi)的構(gòu)造函數(shù),返回該類(lèi)的對(duì)象。如a = new Animal();返回的對(duì)象賦給變量a。我們來(lái)分析一下內(nèi)存分配的步驟,new一個(gè)類(lèi),實(shí)際上就創(chuàng)造了一個(gè)對(duì)象,就要為這個(gè)對(duì)象分配內(nèi)存來(lái)存儲(chǔ)成員變量,放在哪里?放在了堆內(nèi)存中。那么把這個(gè)對(duì)象賦給a,需要再開(kāi)辟一塊兒堆內(nèi)存然后復(fù)制成員變量么?答案是否定的。實(shí)際上a是一個(gè)引用變量,它只存儲(chǔ)內(nèi)存的地址,系統(tǒng)會(huì)讓這個(gè)引用變量指向?qū)ο蟮膬?nèi)存,而不會(huì)重新開(kāi)辟。所以,如果希望垃圾回收機(jī)制回收某個(gè)對(duì)象,那么只需要切斷該對(duì)象所有引用變量和該對(duì)象(該內(nèi)存空間)的關(guān)系,即a=null;內(nèi)存將會(huì)自動(dòng)被回收。
那么a存放在哪里?a存放在棧中。
this:this關(guān)鍵字引用(指向)調(diào)用該方法的對(duì)象。但倘若this出現(xiàn)在構(gòu)造器中則是引用該構(gòu)造器正在初始化的對(duì)象。那么this到底有什么用?我們會(huì)遇到這種情況,一個(gè)方法中需要調(diào)用另一個(gè)方法,由于調(diào)用任何方法都需要對(duì)象,那么如果調(diào)用的是本方法對(duì)象中的另一個(gè)方法,則用this關(guān)鍵字來(lái)表示這個(gè)對(duì)象。當(dāng)然,不用this關(guān)鍵字,同一個(gè)對(duì)象中的方法可以相互調(diào)用,但是其本質(zhì)還是隱式的調(diào)用了this方法。
那么問(wèn)題就來(lái)了1:static修飾的方法中,是否可以調(diào)用非static修飾的成員方法?答案:否,因?yàn)檎{(diào)用方法實(shí)際上隱式的調(diào)用了this來(lái)告知對(duì)象是誰(shuí),但是static修飾的方法是屬于類(lèi)的,而不是屬于對(duì)象的。所以無(wú)法找到對(duì)應(yīng)該方法的對(duì)象。也就是不能使用this,也就無(wú)法調(diào)用其他方法了。
那么問(wèn)題就來(lái)了2:static修飾的方法中,是否可以調(diào)用static修飾的成員方法?答案:是,因?yàn)檎{(diào)用static修飾的方法,實(shí)際上默認(rèn)調(diào)用了該類(lèi)(見(jiàn)點(diǎn)擊打開(kāi)鏈接),而不是this,又static修飾的方法可以找到該類(lèi),所以static調(diào)用static是可行的。
如果實(shí)在是必須在靜態(tài)方法中調(diào)用非靜態(tài)變量或方法,怎么辦?那就只能在調(diào)用的時(shí)候重新申請(qǐng)對(duì)象:比如
System.out.println(new Animal().foot);那么問(wèn)題又來(lái)了,既然static這么不好使,為什么還要設(shè)置static這么個(gè)關(guān)鍵字?其實(shí),其區(qū)別就在于使用static修飾的方法,無(wú)論對(duì)象是誰(shuí),調(diào)用的結(jié)果都一樣。但是非使用static修飾的方法,不同的對(duì)象調(diào)用就會(huì)不同。比如static修飾了一個(gè)變量x,則無(wú)論創(chuàng)建多少實(shí)例,其調(diào)用的都是這個(gè)x。但是如果調(diào)用普通變量b,那么每次創(chuàng)建實(shí)例都要重新給b賦值。因?yàn)閟tatic變量是屬于類(lèi)的,其生存周期和類(lèi)相同,但是普通變量是屬于對(duì)象的,其生存周期與變量是相同的,對(duì)象不存在了,該變量就不存在了。
成員變量(無(wú)論是類(lèi)變量還是對(duì)象變量)都存放在堆中,但是局部變量則存放于棧中,由于局部變量不需要系統(tǒng)垃圾回收,隨著代碼塊兒或者方法的運(yùn)行結(jié)束而結(jié)束,所以所占內(nèi)存比較小。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 深圳企鹅岛开建 腾讯全球总部投资3
- 下一篇: Java 操作符:Java 中操作符优先