青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天之道

享受編程的樂趣。
posts - 118, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

Java對(duì)象引用(轉(zhuǎn))

Posted on 2013-09-27 08:39 hoshelly 閱讀(591) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Java
作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉(zhuǎn)載,也請(qǐng)保留這段聲明。謝謝!

 

我們之前一直在使用“對(duì)象”這個(gè)概念,但沒有探討對(duì)象在內(nèi)存中的具體存儲(chǔ)方式。這方面的討論將引出“對(duì)象引用”(object reference)這一重要概念。 

 

對(duì)象引用
我們沿用之前定義的Human類,并有一個(gè)Test類:

復(fù)制代碼
public class Test
{
    public static void main(String[] args)
    {
        Human aPerson = new Human(160);                 
    }
}

class Human
{   
    /**
     * constructor
     */
    public Human(int h)
    {
        this.height = h;
    }

    /**
     * accessor
     */
    public int getHeight()
    {
       return this.height;
    }

    /**
     * mutator
     */
    public void growHeight(int h)
    {
        this.height = this.height + h;
    }

    private int height;
}
復(fù)制代碼
 

外部可以調(diào)用類來(lái)創(chuàng)建對(duì)象,比如上面在Test類中:

Human aPerson = new Human(160);
創(chuàng)建了一個(gè)Human類的對(duì)象aPerson。 

上面是一個(gè)非常簡(jiǎn)單的表述,但我們有許多細(xì)節(jié)需要深入:

首先看等號(hào)的右側(cè)。new是在內(nèi)存中為對(duì)象開辟空間。具體來(lái)說(shuō),new是在內(nèi)存的堆(heap)上為對(duì)象開辟空間。這一空間中,保存有對(duì)象的數(shù)據(jù)和方法。
再看等號(hào)的左側(cè)。aPerson指代一個(gè)Human對(duì)象,被稱為對(duì)象引用(reference)。實(shí)際上,aPerson并不是對(duì)象本身,而是類似于一個(gè)指向?qū)ο蟮闹羔槨Person存在于內(nèi)存的棧(stack)中。
當(dāng)我們用等號(hào)賦值時(shí),是將右側(cè)new在堆中創(chuàng)建對(duì)象的地址賦予給對(duì)象引用。
這里的內(nèi)存,指的是JVM (Java Virtual Machine)虛擬出來(lái)的Java進(jìn)程內(nèi)存空間。內(nèi)存的堆和棧概念可參考Linux從程序到進(jìn)程。

 



對(duì)象引用


棧的讀取速度比堆快,但棧上存儲(chǔ)的數(shù)據(jù)受到有效范圍的限制。在C語(yǔ)言中,當(dāng)一次函數(shù)調(diào)用結(jié)束時(shí),相應(yīng)的棧幀(stack frame)要?jiǎng)h除,棧幀上存儲(chǔ)的參量和自動(dòng)變量就消失了。Java的棧也受到同樣的限制,當(dāng)一次方法調(diào)用結(jié)束,該方法存儲(chǔ)在棧上的數(shù)據(jù)將清空。在 Java中,所有的(普通)對(duì)象都儲(chǔ)存在堆上。因此,new關(guān)鍵字的完整含義是,在堆上創(chuàng)建對(duì)象。

 

基本類型(primitive type)的對(duì)象,比如int, double,保存在棧上。當(dāng)我們聲明基本類型時(shí),不需要new。一旦聲明,Java將在棧上直接存儲(chǔ)基本類型的數(shù)據(jù)。所以,基本類型的變量名表示的是數(shù)據(jù)本身,不是引用。

 

 

引用和對(duì)象的關(guān)系就像風(fēng)箏和人。我們看天空時(shí)(程序里寫的),看到的是風(fēng)箏(引用),但風(fēng)箏下面對(duì)應(yīng)的,是人(對(duì)象):



引用和對(duì)象分離;引用指向?qū)ο?/span>

 

盡管引用和對(duì)象是分離的,但我們所有通往對(duì)象的訪問(wèn)必須經(jīng)過(guò)引用這個(gè)“大門”,比如以 引用.方法() 的方式訪問(wèn)對(duì)象的方法。在Java中,我們不能跳過(guò)引用去直接接觸對(duì)象。再比如,對(duì)象a的數(shù)據(jù)成員如果是一個(gè)普通對(duì)象b,a的數(shù)據(jù)成員保存的是指向?qū)ο骲的引用 (如果是基本類型變量,那么a的數(shù)據(jù)成員保存的是基本類型變量本身了)。

在Java中,引用起到了指針的作用,但我們不能直接修改指針的值,比如像C語(yǔ)言那樣將指針值加1。我們只能通過(guò)引用執(zhí)行對(duì)對(duì)象的操作。這樣的設(shè)計(jì)避免了許多指針可能引起的錯(cuò)誤。

 

引用的賦值
當(dāng)我們將一個(gè)引用賦值給另一個(gè)引用時(shí),我們實(shí)際上復(fù)制的是對(duì)象的地址。兩個(gè)引用將指向同一對(duì)象。比如 dummyPerson=aPerson;,將導(dǎo)致:



一個(gè)對(duì)象可以有多個(gè)引用 (一個(gè)人可以放多個(gè)風(fēng)箏)。當(dāng)程序通過(guò)某個(gè)引用修改對(duì)象時(shí),通過(guò)其他引用也可以看到該修改。我們可以用以下Test類來(lái)測(cè)試實(shí)際效果:

復(fù)制代碼
public class Test
{
    public static void main(String[] args)
        {
             Human aPerson = new Human(160);
             Human dummyPerson = aPerson;
             System.out.println(dummyPerson.getHeight());
             aPerson.growHeight(20);
             System.out.println(dummyPerson.getHeight());
        }
}
復(fù)制代碼
我們對(duì)aPerson的修改將影響到dummyPerson。這兩個(gè)引用實(shí)際上指向同一對(duì)象。

 

所以,將一個(gè)引用賦值給另一個(gè)引用,并不能復(fù)制對(duì)象本身。我們必須尋求其他的機(jī)制來(lái)復(fù)制對(duì)象。

 

垃圾回收
隨著方法調(diào)用的結(jié)束,引用和基本類型變量會(huì)被清空。由于對(duì)象存活于堆,所以對(duì)象所占據(jù)的內(nèi)存不會(huì)隨著方法調(diào)用的結(jié)束而清空。進(jìn)程空間可能很快被不斷創(chuàng)建的對(duì)象占滿。Java內(nèi)建有垃圾回收(garbage collection)機(jī)制,用于清空不再使用的對(duì)象,以回收內(nèi)存空間。

垃圾回收的基本原則是,當(dāng)存在引用指向某個(gè)對(duì)象時(shí),那么該對(duì)象不會(huì)被回收; 當(dāng)沒有任何引用指向某個(gè)對(duì)象時(shí),該對(duì)象被清空。它所占據(jù)的空間被回收。

上圖假設(shè)了某個(gè)時(shí)刻JVM中的內(nèi)存狀態(tài)。Human Object有三個(gè)引用: 來(lái)自棧的aPerson和dummyPerson,以及另一個(gè)對(duì)象的數(shù)據(jù)成員president。而Club Object沒有引用。如果這個(gè)時(shí)候垃圾回收啟動(dòng),那么Club Object將被清空,而Human Object來(lái)自Club Object的引用(president)也隨之被刪除。

 

垃圾回收是Java中重要的機(jī)制,它直接影響了Java的運(yùn)行效率。我將在以后深入其細(xì)節(jié)。

 

參數(shù)傳遞

當(dāng)我們分離了引用和對(duì)象的概念后,Java方法的參數(shù)傳遞機(jī)制實(shí)際上非常清晰: Java的參數(shù)傳遞為值傳遞。也就是說(shuō),當(dāng)我們傳遞一個(gè)參數(shù)時(shí),方法將獲得該參數(shù)的一個(gè)拷貝。

實(shí)際上,我們傳遞的參數(shù),一個(gè)是基本類型的變量,另一個(gè)為對(duì)象的引用。

基本類型變量的值傳遞,意味著變量本身被復(fù)制,并傳遞給Java方法。Java方法對(duì)變量的修改不會(huì)影響到原變量。

引用的值傳遞,意味著對(duì)象的地址被復(fù)制,并傳遞給Java方法。Java方法根據(jù)該引用的訪問(wèn)將會(huì)影響對(duì)象。

 

在這里有另一個(gè)值得一提的情況: 我們?cè)诜椒▋?nèi)部使用new創(chuàng)建對(duì)象,并將該對(duì)象的引用返回。如果該返回被一個(gè)引用接收,由于對(duì)象的引用不為0,對(duì)象依然存在,不會(huì)被垃圾回收。

 

總結(jié)
new

引用,對(duì)象

被垃圾回收的條件

參數(shù): 值傳遞

 

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情一区在线| 亚洲精品国偷自产在线99热| 欧美大片免费| 国产欧美日韩在线观看| 日韩网站在线观看| 亚洲国产精品久久久久秋霞影院| 亚洲午夜激情网页| 99在线精品视频| 欧美国产日本韩| 嫩草国产精品入口| 激情久久五月| 欧美专区在线观看一区| 欧美自拍偷拍午夜视频| 国产精品久久久久久影视| 亚洲日本va午夜在线影院| 伊人蜜桃色噜噜激情综合| 欧美在线视频观看免费网站| 久久成人av少妇免费| 国产精品区一区二区三| 在线视频欧美日韩精品| 亚洲一区二区三区在线看| 欧美国产日韩精品| 亚洲国产精品专区久久| 亚洲精一区二区三区| 欧美成人免费一级人片100| 亚洲电影第三页| 亚洲三级电影在线观看| 欧美福利一区| 亚洲毛片播放| 亚洲专区一区| 国产乱码精品一区二区三区五月婷 | 国产精品h在线观看| 日韩视频一区二区在线观看 | 亚洲欧美日韩国产精品| 欧美一乱一性一交一视频| 国产女同一区二区| 久久精品亚洲热| 欧美国产成人精品| 99视频超级精品| 国产精品高潮粉嫩av| 午夜一区二区三区在线观看| 久久久久久久999| 亚洲黄色在线视频| 欧美日韩国产精品一区| 亚洲一区成人| 鲁大师成人一区二区三区| 亚洲欧洲精品一区二区| 欧美日韩在线亚洲一区蜜芽 | 欧美中文在线字幕| 欧美成人精品高清在线播放| 日韩视频在线你懂得| 国产精品成人午夜| 久久久久成人精品| 最新国产の精品合集bt伙计| 午夜精品久久久久久久99黑人| 国产在线欧美| 欧美精品久久久久久久久久| 亚洲欧美日本另类| 欧美好骚综合网| 午夜精品福利视频| 亚洲国产你懂的| 国产麻豆午夜三级精品| 美女精品在线| 亚洲欧美激情精品一区二区| 欧美黄色免费网站| 欧美一区二区免费| 亚洲国产三级在线| 国产精品久久久久久久久免费| 久久久久久网站| 一区二区高清视频| 欧美激情在线播放| 欧美在线观看视频一区二区| 亚洲欧洲一区二区三区久久| 国产欧美在线播放| 欧美四级电影网站| 欧美成人一区二区三区| 欧美在线播放视频| 亚洲无吗在线| 亚洲欧洲精品一区二区三区波多野1战4 | 最近中文字幕日韩精品 | 欧美一区免费视频| 一本久久综合| 亚洲国产影院| 欧美成人午夜激情视频| 久久精品视频在线| 亚洲素人一区二区| 亚洲人成在线观看| 在线观看欧美| 国语自产精品视频在线看| 欧美肉体xxxx裸体137大胆| 农夫在线精品视频免费观看| 久久成人一区二区| 亚洲欧美日韩一区在线观看| 99国产精品99久久久久久粉嫩| 欧美国产日产韩国视频| 久久久久久一区| 久久疯狂做爰流白浆xx| 亚洲欧美日韩精品一区二区| 一本色道久久综合| 亚洲人成久久| 亚洲国产成人精品久久| 在线免费观看日本一区| 黄色成人av在线| 国产亚洲激情视频在线| 国产农村妇女精品一二区| 国产精品久久久久三级| 国产精品美女www爽爽爽视频| 免费成人毛片| 欧美国产一区二区在线观看| 男人的天堂亚洲| 欧美激情偷拍| 欧美美女操人视频| 欧美性天天影院| 欧美性事在线| 国产农村妇女精品| 激情国产一区| 最新日韩在线| 一区二区三区av| 亚洲一区二区三区精品动漫| 午夜激情综合网| 久久精品国产69国产精品亚洲| 久久国产欧美| 欧美国产综合视频| 亚洲精品少妇30p| 亚洲一区二区精品| 欧美在线观看www| 美女图片一区二区| 欧美日韩亚洲天堂| 国产欧美大片| 亚洲第一福利社区| 一本久久青青| 欧美中文日韩| 欧美风情在线观看| 99这里有精品| 久久精彩视频| 欧美日产国产成人免费图片| 国产精品性做久久久久久| 国内外成人免费激情在线视频 | 激情久久久久久久久久久久久久久久| 狠久久av成人天堂| 日韩性生活视频| 久久成人18免费观看| 欧美激情网友自拍| 亚洲一区二区三| 麻豆乱码国产一区二区三区| 国产精品99免视看9| 在线日韩av永久免费观看| 夜夜爽www精品| 久久免费高清视频| 亚洲精品一区二区三区四区高清| 午夜天堂精品久久久久| 欧美国产精品v| 狠狠色综合色区| 亚洲一区二区三区高清 | 欧美超级免费视 在线| 国产精品99久久久久久久久久久久 | 夜夜精品视频一区二区| 欧美有码视频| 欧美日韩一区二区精品| 亚洲国产精品成人综合| 欧美有码在线视频| 99成人精品| 免费观看在线综合| 国产一区二区三区在线观看免费视频| 99精品国产福利在线观看免费| 久久综合久久综合久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美xart系列高清| 尹人成人综合网| 欧美在线国产精品| 在线视频欧美日韩精品| 欧美激情二区三区| 亚洲第一黄色| 久久久人成影片一区二区三区 | 欧美视频久久| 亚洲人成网站色ww在线| 老鸭窝亚洲一区二区三区| 亚洲欧美日韩区| 国产精品久久二区| 亚洲午夜小视频| 亚洲六月丁香色婷婷综合久久| 牛夜精品久久久久久久99黑人| 激情亚洲一区二区三区四区| 久久国产精品第一页| 亚洲综合成人在线| 国产精品一区二区三区久久| 亚洲一区在线播放| 一区二区欧美视频| 欧美性感一类影片在线播放 | 亚洲美女视频| 欧美精品在线视频观看| 亚洲精品视频在线看| 亚洲国产高清高潮精品美女| 免费日韩一区二区| 亚洲精品一二三| 亚洲精品一区二区网址| 欧美日韩免费观看一区=区三区| 一本色道久久99精品综合| 99ri日韩精品视频| 国产精品欧美久久|