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

天之道

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

Java對象引用(轉)

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

 

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

 

對象引用
我們沿用之前定義的Human類,并有一個Test類:

復制代碼
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;
}
復制代碼
 

外部可以調用類來創建對象,比如上面在Test類中:

Human aPerson = new Human(160);
創建了一個Human類的對象aPerson。 

上面是一個非常簡單的表述,但我們有許多細節需要深入:

首先看等號的右側。new是在內存中為對象開辟空間。具體來說,new是在內存的堆(heap)上為對象開辟空間。這一空間中,保存有對象的數據和方法。
再看等號的左側。aPerson指代一個Human對象,被稱為對象引用(reference)。實際上,aPerson并不是對象本身,而是類似于一個指向對象的指針。aPerson存在于內存的棧(stack)中。
當我們用等號賦值時,是將右側new在堆中創建對象的地址賦予給對象引用。
這里的內存,指的是JVM (Java Virtual Machine)虛擬出來的Java進程內存空間。內存的堆和棧概念可參考Linux從程序到進程。

 



對象引用


棧的讀取速度比堆快,但棧上存儲的數據受到有效范圍的限制。在C語言中,當一次函數調用結束時,相應的棧幀(stack frame)要刪除,棧幀上存儲的參量和自動變量就消失了。Java的棧也受到同樣的限制,當一次方法調用結束,該方法存儲在棧上的數據將清空。在 Java中,所有的(普通)對象都儲存在堆上。因此,new關鍵字的完整含義是,在堆上創建對象。

 

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

 

 

引用和對象的關系就像風箏和人。我們看天空時(程序里寫的),看到的是風箏(引用),但風箏下面對應的,是人(對象):



引用和對象分離;引用指向對象

 

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

在Java中,引用起到了指針的作用,但我們不能直接修改指針的值,比如像C語言那樣將指針值加1。我們只能通過引用執行對對象的操作。這樣的設計避免了許多指針可能引起的錯誤。

 

引用的賦值
當我們將一個引用賦值給另一個引用時,我們實際上復制的是對象的地址。兩個引用將指向同一對象。比如 dummyPerson=aPerson;,將導致:



一個對象可以有多個引用 (一個人可以放多個風箏)。當程序通過某個引用修改對象時,通過其他引用也可以看到該修改。我們可以用以下Test類來測試實際效果:

復制代碼
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());
        }
}
復制代碼
我們對aPerson的修改將影響到dummyPerson。這兩個引用實際上指向同一對象。

 

所以,將一個引用賦值給另一個引用,并不能復制對象本身。我們必須尋求其他的機制來復制對象。

 

垃圾回收
隨著方法調用的結束,引用和基本類型變量會被清空。由于對象存活于堆,所以對象所占據的內存不會隨著方法調用的結束而清空。進程空間可能很快被不斷創建的對象占滿。Java內建有垃圾回收(garbage collection)機制,用于清空不再使用的對象,以回收內存空間。

垃圾回收的基本原則是,當存在引用指向某個對象時,那么該對象不會被回收; 當沒有任何引用指向某個對象時,該對象被清空。它所占據的空間被回收。

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

 

垃圾回收是Java中重要的機制,它直接影響了Java的運行效率。我將在以后深入其細節。

 

參數傳遞

當我們分離了引用和對象的概念后,Java方法的參數傳遞機制實際上非常清晰: Java的參數傳遞為值傳遞。也就是說,當我們傳遞一個參數時,方法將獲得該參數的一個拷貝。

實際上,我們傳遞的參數,一個是基本類型的變量,另一個為對象的引用。

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

引用的值傳遞,意味著對象的地址被復制,并傳遞給Java方法。Java方法根據該引用的訪問將會影響對象。

 

在這里有另一個值得一提的情況: 我們在方法內部使用new創建對象,并將該對象的引用返回。如果該返回被一個引用接收,由于對象的引用不為0,對象依然存在,不會被垃圾回收。

 

總結
new

引用,對象

被垃圾回收的條件

參數: 值傳遞

 

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   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>
            极品尤物久久久av免费看| 国外精品视频| 亚洲精品乱码久久久久久蜜桃91| 久久亚洲综合| 久久裸体视频| 亚洲激情自拍| 亚洲麻豆视频| 国产精品美女一区二区在线观看| 午夜在线电影亚洲一区| 亚洲一级在线观看| 国产午夜精品视频免费不卡69堂| 久久久噜噜噜久久人人看| 久久精品一区| 亚洲精品美女| 亚洲资源av| 伊人天天综合| 亚洲精品国产品国语在线app| 欧美区在线播放| 欧美一区二区三区四区夜夜大片 | 久久精品一区二区三区四区| 欧美一区二区日韩| 亚洲人体大胆视频| 亚洲视频高清| 亚洲第一页中文字幕| 亚洲毛片在线看| 国产网站欧美日韩免费精品在线观看| 久久综合一区| 国产精品av久久久久久麻豆网| 欧美在线日韩精品| 欧美超级免费视 在线| 亚洲一区二区免费看| 欧美在线亚洲一区| 一区二区三区日韩精品视频| 午夜精品一区二区在线观看| 亚洲三级影院| 欧美一区二区三区视频免费| 日韩一区二区高清| 久久久www| 亚洲欧美日韩国产成人| 噜噜噜91成人网| 欧美在线综合视频| 欧美人成免费网站| 欧美成人精品高清在线播放| 国产精品亚洲人在线观看| 亚洲国产日韩美| 精品9999| 先锋影音网一区二区| 一本大道久久a久久综合婷婷| 久久久精彩视频| 西西人体一区二区| 欧美日韩精品二区第二页| 欧美激情视频在线免费观看 欧美视频免费一 | 一区二区三区福利| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲欧洲日韩女同| 久久激情网站| 久久精品男女| 国产美女精品| 亚洲欧美视频一区| 亚洲欧美日本国产专区一区| 欧美日韩国产一区二区三区| 亚洲国产天堂网精品网站| 在线观看中文字幕不卡| 先锋影音国产精品| 欧美一区二区三区在线免费观看| 欧美日韩一区二区视频在线| 亚洲经典三级| 99国产精品99久久久久久粉嫩 | av72成人在线| 亚洲无亚洲人成网站77777| 欧美另类变人与禽xxxxx| 欧美激情精品久久久久久免费印度| 黄色av成人| 久久婷婷影院| 欧美成在线观看| 亚洲欧洲视频在线| 欧美激情导航| 夜色激情一区二区| 午夜欧美不卡精品aaaaa| 国产精品日本精品| 欧美一区视频在线| 免费成人性网站| 亚洲三级毛片| 欧美系列亚洲系列| 午夜精品国产精品大乳美女| 久久精品一区中文字幕| …久久精品99久久香蕉国产| 蜜桃av噜噜一区| 亚洲免费观看在线观看| 午夜一区二区三区不卡视频| 国产日韩欧美在线播放| 久久综合久久综合久久综合| 欧美黄色日本| 亚洲欧美日本日韩| 国内外成人免费激情在线视频网站 | 一本色道88久久加勒比精品| 欧美在线网址| 亚洲电影在线免费观看| 欧美日韩a区| 亚洲女人av| 免费亚洲电影| 亚洲一区成人| 亚洲国产欧美在线| 国产精品久久九九| 久久综合九色综合久99| 宅男噜噜噜66国产日韩在线观看| 久久精品国产69国产精品亚洲 | 欧美人体xx| 欧美亚洲视频在线观看| 欧美激情小视频| 欧美一区二区三区四区在线| 亚洲人成网站777色婷婷| 国产精品丝袜久久久久久app| 牛牛国产精品| 久久高清免费观看| 国产精品99久久久久久宅男| 麻豆91精品| 欧美亚洲日本国产| 日韩亚洲不卡在线| 国外成人网址| 国产精品免费看| 欧美巨乳在线| 老司机免费视频一区二区三区| 亚洲在线免费观看| 一本到12不卡视频在线dvd| 老色鬼久久亚洲一区二区| 香蕉久久一区二区不卡无毒影院 | 一区二区三区自拍| 国产精品毛片在线| 欧美另类videos死尸| 久久综合狠狠| 久久久久国产精品人| 欧美一级黄色网| 亚洲亚洲精品三区日韩精品在线视频| 亚洲国产欧美另类丝袜| 美女脱光内衣内裤视频久久影院 | 久久综合伊人77777尤物| 销魂美女一区二区三区视频在线| 一区二区精品| 99精品视频免费观看| 亚洲精品麻豆| 亚洲美女视频网| 亚洲精品欧美激情| 91久久夜色精品国产九色| 伊人精品视频| 亚洲国产精彩中文乱码av在线播放| 国产日韩精品一区二区三区| 国产精品美女久久久久久免费 | 久久久精品久久久久| 久久国产夜色精品鲁鲁99| 欧美在线影院在线视频| 欧美在线亚洲一区| 久久精品一区二区| 美女精品网站| 欧美激情一区二区三区四区| 欧美成人免费网站| 欧美美女视频| 欧美午夜视频网站| 国产精品自在线| 国产在线乱码一区二区三区| 黄色一区三区| 亚洲精品影视在线观看| 亚洲视频1区2区| 午夜精品久久| 久久天天躁狠狠躁夜夜av| 欧美国产在线观看| 亚洲精品欧美一区二区三区| av不卡在线| 欧美与黑人午夜性猛交久久久| 久久久999国产| 欧美激情一级片一区二区| 国产精品99一区| 国产一区二区三区成人欧美日韩在线观看| 在线亚洲免费| 欧美大片网址| 欧美日本三区| 国产精品欧美在线| 樱花yy私人影院亚洲| 亚洲三级电影在线观看 | 欧美精品成人91久久久久久久| 欧美日韩成人| 国产一级久久| 亚洲精品少妇| 篠田优中文在线播放第一区| 欧美18av| 亚洲视频在线视频| 久久婷婷一区| 国产精品影视天天线| 亚洲激情校园春色| 欧美在线免费视屏| 亚洲精品影院在线观看| 午夜日韩在线| 欧美理论电影在线观看| 国产一区二区三区直播精品电影 | 国模私拍一区二区三区| 一本大道久久a久久综合婷婷| 久久久精品999| 亚洲久久一区| 久久在线观看视频| 国产视频在线观看一区二区三区|