首頁(yè)技術(shù)文章正文

Java創(chuàng)建實(shí)例對(duì)象

更新時(shí)間:2020-09-09 來(lái)源:黑馬程序員 瀏覽量:

應(yīng)用程序想要完成具體的功能,僅有類是遠(yuǎn)遠(yuǎn)不夠的,還需要根據(jù)類創(chuàng)建實(shí)例對(duì)象。在Java程序中,可以使用new關(guān)鍵字來(lái)創(chuàng)建對(duì)象,具體語(yǔ)法格式如下:

類名 對(duì)象名稱 = new 類名();

例如,創(chuàng)建Person類的實(shí)例對(duì)象代碼如下:

Person p = new Person();

上面的代碼中,“new Person()”用于創(chuàng)建Person類的一個(gè)實(shí)例對(duì)象,“Person p”則是聲明了一個(gè)Person類型的變量p,中間的等號(hào)用于將Person對(duì)象在內(nèi)存中的地址賦值給變量p,這樣變量p便持有了對(duì)象的引用。為了便于描述,本書接下來(lái)的章節(jié),通常會(huì)將變量p引用的對(duì)象簡(jiǎn)稱為p對(duì)象。在內(nèi)存中變量p和對(duì)象之間的引用關(guān)系如圖1所示。

1599641182914_java內(nèi)存01.png

從圖1可以看出,在創(chuàng)建Person對(duì)象時(shí),程序會(huì)占用兩塊內(nèi)存區(qū)域,分別是棧內(nèi)存和堆內(nèi)存。其中Person類型的變量p被存放在棧內(nèi)存中,它是一個(gè)引用,會(huì)指向真正的對(duì)象;通過new Person()創(chuàng)建的對(duì)象則放在堆內(nèi)存中,這才是真正的對(duì)象。

小提示:

Java將內(nèi)存分為兩種,即棧內(nèi)存和堆內(nèi)存。其中棧內(nèi)存用于存放基本類型的變量和對(duì)象的引用變量(如Person p),堆內(nèi)存用于存放由new創(chuàng)建的對(duì)象和數(shù)組。

在創(chuàng)建Person對(duì)象后,可以通過對(duì)象的引用來(lái)訪問對(duì)象所有的成員,具體格式如下:

對(duì)象引用.對(duì)象成員

接下來(lái)通過一個(gè)案例來(lái)學(xué)習(xí)如何訪問對(duì)象的成員,如文件1所示。

文件1 Example02.java

public class Example02 {
    public static void main(String[] args) {    
            Person p1 = new Person(); // 創(chuàng)建第一個(gè)Person類對(duì)象
            Person p2 = new Person(); // 創(chuàng)建第二個(gè)Person類對(duì)象
            p1.age = 18;                 // 為age屬性賦值
            p1.speak();                  // 調(diào)用對(duì)象的方法
            p2.speak();
        }
}

運(yùn)行結(jié)果如圖2所示。

1599641198732_java類運(yùn)行結(jié)果jpg.jpg

圖2 運(yùn)行結(jié)果

文件1中,p1、p2分別引用了Person類的兩個(gè)實(shí)例對(duì)象。從圖2可以看出,p1和p2對(duì)象在調(diào)用speak()方法時(shí),打印的age值不同。這是因?yàn)閜1對(duì)象和p2對(duì)象是兩個(gè)完全獨(dú)立的個(gè)體,它們分別擁有各自的age屬性,對(duì)p1對(duì)象的age屬性進(jìn)行賦值并不會(huì)影響到p2對(duì)象age屬性的值。程序運(yùn)行期間p1、p2引用的對(duì)象在內(nèi)存中的狀態(tài)如圖3所示。

1599641208049_java內(nèi)存分析02.jpg

圖3 P1、P2對(duì)象在內(nèi)存中的狀態(tài)

小提示:

在實(shí)際情況下,除了可以使用文件3-2中介紹的對(duì)象引用來(lái)訪問對(duì)象成員外,還可以直接使用創(chuàng)建的對(duì)象本身來(lái)引用對(duì)象成員,具體格式如下:

new 類名().對(duì)象成員

這種方式是在通過new關(guān)鍵字創(chuàng)建實(shí)例對(duì)象的同時(shí)就訪問了對(duì)象的某個(gè)成員,并且在創(chuàng)建后只能訪問其中某一個(gè)成員,而不能像對(duì)象引用那樣可以訪問多個(gè)對(duì)象成員。同時(shí),由于沒有對(duì)象引用的存在,在完成某一個(gè)對(duì)象成員的訪問后,該對(duì)象就會(huì)變成垃圾對(duì)象。所以,在實(shí)際開發(fā)中,創(chuàng)建實(shí)例對(duì)象時(shí)多數(shù)會(huì)使用對(duì)象引用。

在文件1中,通過“p1.age=18”將p1對(duì)象的age屬性賦值為18,但并沒有對(duì)p2對(duì)象的age屬性進(jìn)行賦值,按理說(shuō)p2對(duì)象的age屬性應(yīng)該是沒有值的。但從圖2可以看出,p2對(duì)象的age屬性也是有值的,其值為0。這是因?yàn)樵趯?shí)例化對(duì)象時(shí),Java虛擬機(jī)會(huì)自動(dòng)為成員變量進(jìn)行初始化,針對(duì)不同類型的成員變量賦予不同的初始值,如表1所示。

表1 成員變量的初始化值

1599641218209_java內(nèi)存分析04.jpg

當(dāng)對(duì)象被實(shí)例化后,在程序中可以通過對(duì)象的引用變量來(lái)訪問該對(duì)象的成員。需要注意的是,當(dāng)沒有任何變量引用這個(gè)對(duì)象時(shí),它將成為垃圾對(duì)象,不能再被使用。接下來(lái)通過兩段程序代碼來(lái)分析對(duì)象是如何成為垃圾的。

第一段程序代碼:

{
     Person p1 = new Person();     ......}

上面的代碼中,使用變量p1引用了一個(gè)Person類型的對(duì)象。當(dāng)這段代碼運(yùn)行完畢時(shí),變量p1就會(huì)超出其作用域而被銷毀,這時(shí)Person類型的對(duì)象將因?yàn)闆]有被任何變量所引用而變成垃圾。

第二段程序代碼:

{
     Person p2 = new Person();     ......
     p2 = null;     ......}

上面的代碼中,使用變量p2引用了一個(gè)Person類型的對(duì)象,接著將變量p2的值置為null,則表示該變量不指向任何一個(gè)對(duì)象,被p2所引用的Person對(duì)象就會(huì)失去引用,成為垃圾對(duì)象,過程如圖4所示。

1599641231045_java內(nèi)存分析03.jpg




猜你喜歡:

如何理解面向?qū)ο蟮姆庋b、繼承和多態(tài)?

Java中類和對(duì)象是什么關(guān)系?

java視頻教程下載

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!