亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java基礎教程之對象引用

2019-11-26 15:26:24
字體:
來源:轉載
供稿:網友

我們之前一直在使用“對象”這個概念,但沒有探討對象在內存中的具體存儲方式。這方面的討論將引出“對象引用”(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。

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

1.首先看等號的右側。new是在內存中為對象開辟空間。具體來說,new是在內存的堆(heap)上為對象開辟空間。這一空間中,保存有對象的數據和方法。

2.再看等號的左側。aPerson指代一個Human對象,被稱為對象引用(reference)。實際上,aPerson并不是對象本身,而是類似于一個指向對象的指針。aPerson存在于內存的棧(stack)中。

3.當我們用等號賦值時,是將右側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

引用,對象

被垃圾回收的條件

參數: 值傳遞

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区在线| 国产欧美日韩丝袜精品一区| 欧美成人午夜激情在线| 欧美一性一乱一交一视频| 国产精品视频精品视频| 国产69精品久久久| 国产精品极品美女在线观看免费| 久久成人亚洲精品| 欧美一级黑人aaaaaaa做受| 国产精品久久97| 国产亚洲精品成人av久久ww| 亚洲精品国产综合久久| 久久精品久久久久久国产 免费| 午夜精品福利在线观看| 亚洲人成电影在线播放| 成人www视频在线观看| 日韩欧美高清在线视频| 国产午夜精品美女视频明星a级| 亚洲免费电影一区| 亚洲色图激情小说| 555www成人网| 久久夜精品va视频免费观看| 国产精品久久久久av免费| 亚洲a∨日韩av高清在线观看| 国产97在线亚洲| 日韩亚洲欧美中文在线| 亚洲毛片在线看| 亚洲久久久久久久久久| 亚洲人成电影网站色xx| 日韩精品在线电影| 国产精品自产拍在线观看| 日韩美女写真福利在线观看| 国产精品中文在线| 91高清免费视频| 91大神福利视频在线| 亚洲伦理中文字幕| 欧美尤物巨大精品爽| 亚洲伊人久久大香线蕉av| 色与欲影视天天看综合网| 久久国产精品久久久久| 久久黄色av网站| 亚洲天堂av在线免费观看| 久久福利视频网| 亚洲一区二区在线播放| 色婷婷久久av| 亚洲视频网站在线观看| 成人网在线免费看| 色妞久久福利网| 亚洲视频在线播放| 国产日韩欧美中文| 国产欧美在线播放| 日韩精品视频在线免费观看| 国产婷婷97碰碰久久人人蜜臀| 久久国产一区二区三区| 精品人伦一区二区三区蜜桃免费| 岛国视频午夜一区免费在线观看| 欧美性在线观看| 欧美人成在线视频| 国产精品爽爽ⅴa在线观看| 欧美激情伊人电影| 国产精品一二三在线| 精品精品国产国产自在线| 亚洲精品中文字幕有码专区| 日本一区二区三区在线播放| 国产欧美韩国高清| 亚洲无限乱码一二三四麻| 91av在线看| 亚洲一区二区三区香蕉| 国产美女精品视频| 欧美高跟鞋交xxxxhd| 26uuu亚洲伊人春色| 亚洲精品久久久久中文字幕欢迎你| 日本亚洲欧美成人| 国产精品网站大全| 国产精品久久久久久久久久久久久久| 精品自在线视频| 久久国产天堂福利天堂| 4k岛国日韩精品**专区| 日韩成人激情视频| 欧美日韩精品在线观看| www欧美日韩| 国产精品视频1区| 欧美日韩成人在线视频| 亚洲电影免费观看高清完整版在线| 欧美精品中文字幕一区| 日韩精品在线视频观看| 久久久久久久久久亚洲| 欧美激情久久久久| 欧美高清视频免费观看| 日韩有码片在线观看| 国产精品爱啪在线线免费观看| 国产一区二区黑人欧美xxxx| 久久久国产精品x99av| 中文字幕精品一区久久久久| 亚洲国产高清福利视频| 精品国产一区二区三区久久狼黑人| 国产成人+综合亚洲+天堂| 韩国福利视频一区| 欧美精品电影在线| 不卡av在线播放| 国产色综合天天综合网| 亚洲影院污污.| 中文字幕精品久久| 夜夜嗨av一区二区三区四区| 欧美理论电影在线观看| 亚洲第一精品久久忘忧草社区| 成人亲热视频网站| 日韩精品久久久久久福利| www.日韩.com| 91视频国产精品| 97久久精品人搡人人玩| 久热精品视频在线观看| 成人性生交大片免费观看嘿嘿视频| 国产精品九九九| 久久中文字幕视频| 国产午夜精品视频免费不卡69堂| 国产成人精品一区| 久热精品视频在线观看| 91av在线不卡| 亚洲精品aⅴ中文字幕乱码| 色综合天天综合网国产成人网| 欧美日韩免费观看中文| 欧美极度另类性三渗透| 91精品国产91久久久久| 91av在线视频观看| 国产91在线播放九色快色| 亚洲欧洲日韩国产| 成人欧美一区二区三区在线| 国产精品无av码在线观看| 亚洲香蕉成视频在线观看| 欧美自拍视频在线| 欧美视频13p| 另类少妇人与禽zozz0性伦| 欧美乱妇40p| 国产视频精品自拍| 2020欧美日韩在线视频| 国产乱肥老妇国产一区二| 九九热r在线视频精品| 成人精品网站在线观看| 欧美黑人性生活视频| 亚洲欧美日韩另类| 亚洲一区中文字幕| 亚洲无线码在线一区观看| 在线视频欧美日韩| 日韩欧美视频一区二区三区| 欧美日韩第一页| 久久精品91久久久久久再现| 国产精品久久久久久一区二区| 欧美成年人在线观看| 久久精品国产一区二区三区| 国内精品久久久久| 国产一区二区三区在线视频| 亚洲午夜久久久久久久| 国产精品视频午夜| 亚洲大胆人体视频| 伊人伊成久久人综合网站| 91色中文字幕| 91免费视频网站| 欧美日韩午夜剧场| 国产精品亚洲欧美导航| 日韩av不卡在线| 亚洲自拍小视频| 久久久久日韩精品久久久男男| 欧美老女人性生活|