Python知識(shí)分享網(wǎng) - 專(zhuān)業(yè)的Python學(xué)習(xí)網(wǎng)站 學(xué)Python,上Python222
《劍指offer》Java創(chuàng)建對(duì)象的五種方式 PDF 下載
匿名網(wǎng)友發(fā)布于:2024-01-24 11:11:59
(侵權(quán)舉報(bào))
(假如點(diǎn)擊沒(méi)反應(yīng),多刷新兩次就OK!)

《劍指offer》Java創(chuàng)建對(duì)象的五種方式 PDF 下載  圖1

 

 

 

 

資料內(nèi)容:

 

 

使用 new 來(lái)創(chuàng)建對(duì)象
使用 new 來(lái)創(chuàng)建對(duì)象是最簡(jiǎn)單的一種方式了, new Java 中的關(guān)鍵字,new 通過(guò)為新對(duì)象分配內(nèi)存
并返回對(duì)該內(nèi)存的引用來(lái)實(shí)例化一個(gè)類(lèi),這個(gè)實(shí)例化一個(gè)類(lèi)其實(shí)就相當(dāng)于創(chuàng)建了一個(gè)對(duì)象,因?yàn)轭?lèi)也是
一種對(duì)象;new 也負(fù)責(zé)調(diào)用對(duì)象的構(gòu)造函數(shù),下面是使用 new 來(lái)創(chuàng)建對(duì)象的代碼
Object obj = new Object();
這段代碼中,我們?cè)诙褏^(qū)域中分配了一塊內(nèi)存,然后把 obj 對(duì)象指向了這塊內(nèi)存區(qū)域。
不知道你有沒(méi)有看過(guò) new 的字節(jié)碼呢?下面是這段代碼的字節(jié)碼
Java 中,我們認(rèn)為創(chuàng)建一個(gè)對(duì)象就是調(diào)用其構(gòu)造方法,所以我們使用 new Object() 構(gòu)造的對(duì)象,其
實(shí)是調(diào)用了 Object 類(lèi)的 無(wú)參數(shù) 的構(gòu)造方法。但是通過(guò)字節(jié)碼我們發(fā)現(xiàn),對(duì)象的創(chuàng)建和調(diào)用其構(gòu)造方法是分開(kāi)的。
字節(jié)碼的 new 表示在堆中創(chuàng)建一個(gè)對(duì)象,并把對(duì)象的引用推入棧中。 invokespecial 表示調(diào)用對(duì)象無(wú)
參數(shù)的構(gòu)造方法。其實(shí),JVM 提供了五種方法調(diào)用指令,分別是
invokestatic :該指令用于調(diào)用靜態(tài)方法,即使用 static 關(guān)鍵字修飾的方法;
invokespecial :該指令用于三種場(chǎng)景:調(diào)用實(shí)例構(gòu)造方法,調(diào)用私有方法(即 private 關(guān)鍵字修飾
的方法)和父類(lèi)方法(即 super 關(guān)鍵字調(diào)用的方法);
invokeinterface :該指令用于調(diào)用接口方法,在運(yùn)行時(shí)再確定一個(gè)實(shí)現(xiàn)此接口的對(duì)象;
invokevirtual :該指令用于調(diào)用虛方法(就是除了上述三種情況之外的方法);
invokedynamic :在運(yùn)行時(shí)動(dòng)態(tài)解析出調(diào)用點(diǎn)限定符所引用的方法之后,調(diào)用該方法;在 JDK 1.7
中提出,主要用于支持 JVM 上的動(dòng)態(tài)腳本語(yǔ)言(如 GroovyJython 等)
好了,現(xiàn)在你知道了 new invokespecial 是干啥用的,那么 dup 指令呢?
dup 會(huì)復(fù)制棧上的最后一個(gè)元素,然后再次將其推入棧;因此,如果在棧上有一個(gè)對(duì)象引用,并且調(diào)用
dup,則現(xiàn)在在棧上有對(duì)該對(duì)象的兩個(gè)引用。看起來(lái)有點(diǎn)不知其所以然,所以在求助網(wǎng)上的時(shí)候,又
發(fā)現(xiàn)了 R 大的解釋
來(lái)源:./images/52749416
后面的 astore 就會(huì)把操作數(shù)棧頂?shù)哪莻€(gè)引用消耗掉,保存到指定的局部變量去。
如果直接使用 new Object() 沒(méi)有創(chuàng)建局部變量的話(huà),請(qǐng)注意一下它的字節(jié)碼。
看出來(lái)細(xì)微的差別了嗎?上圖中的 astore_1 竟然變成了 pop ,這也就是說(shuō),new Object() 沒(méi)有保存對(duì)
象的局部變量,而是直接把它給消耗掉了。嗯,符合預(yù)期。
所以這是第一種創(chuàng)建的方式,也就是使用 new 來(lái)創(chuàng)建。