日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

构造代码块会想你所想

發(fā)布時間:2025/3/8 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 构造代码块会想你所想 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

上一個建議中我們提議使用構(gòu)造代碼塊來簡化代碼,并且也了解到編譯器會自動把構(gòu)造代碼塊插入到各個構(gòu)造函數(shù)中,那我們接下來看看編譯器是不是足夠聰明,能夠為我們解決真實的開發(fā)問題。有這樣一個案例:統(tǒng)計一個類的實例數(shù)量。可能你要說了,這很簡單,在每個構(gòu)造函數(shù)中加入一個對象計數(shù)器不就解決問題了嗎?或者使用我們上一個建議介紹的,使用構(gòu)造代碼塊也可以。確實如此,我們來看如下代碼是否可行:

1 public class Client { 2 public static void main(String[] args) { 3 new Base(); 4 new Base(""); 5 new Base(0); 6 System.out.println("實例對象數(shù)量:" + Base.getNumOfObjects()); 7 } 8 } 9 10 class Base { 11 // 對象計數(shù)器 12 private static int numOfObjects = 0; 13 14 { 15 // 構(gòu)造代碼塊,計算產(chǎn)生對象數(shù)量 16 numOfObjects++; 17 } 18 19 public Base() { 20 } 21 22 // 有參構(gòu)造調(diào)用無參構(gòu)造 23 public Base(String _str) { 24 this(); 25 } 26 27 // 有參構(gòu)造不調(diào)用其他構(gòu)造 28 public Base(int _i) { 29 } 30 31 // 返回在一個JVM中,創(chuàng)建了多少個實例對象 32 public static int getNumOfObjects() { 33 return numOfObjects; 34 } 35 }

這段代碼是可行的嗎?能計算出實例對象的數(shù)量嗎?哎,好像不對呀,如果編譯器把構(gòu)造代碼塊插入到各個構(gòu)造函數(shù)中,那帶有String形參的構(gòu)造函數(shù)可就有問題,它會調(diào)用無參構(gòu)造,那通過它生成Base對象時就會執(zhí)行兩次構(gòu)造代碼塊:一次是由無參構(gòu)造函數(shù)調(diào)用構(gòu)造代碼塊,一次是執(zhí)行自身的構(gòu)造代碼塊,這樣的話計算可就不準(zhǔn)確了,main函數(shù)實際在內(nèi)存中產(chǎn)生了3個對象,但結(jié)果卻會是4。不過真是這樣的嗎?Are you sure?我們運(yùn)行一下看看結(jié)果:

實例對象數(shù)量:3

非常遺憾,你錯了,實例對象的數(shù)量還是3,程序沒有任何問題。奇怪嗎?不奇怪,上一個建議是說編譯器會把構(gòu)造代碼塊插入到每一個構(gòu)造函數(shù)中,但是有一個例外的情況沒有說明:如果遇到this關(guān)鍵字(也就是構(gòu)造函數(shù)調(diào)用自身其他的構(gòu)造函數(shù)時)則不插入構(gòu)造代碼塊,對于我們的例子來說,編譯器在編譯時發(fā)現(xiàn)String形參的構(gòu)造函數(shù)調(diào)用了無參構(gòu)造,于是放棄插入構(gòu)造代碼塊,所以只執(zhí)行了一次構(gòu)造代碼塊—結(jié)果就是如此。

那Java編譯器為什么會這么聰明呢?這還要從構(gòu)造代碼塊的誕生說起,構(gòu)造代碼塊是為了提取構(gòu)造函數(shù)的共同量,減少各個構(gòu)造函數(shù)的代碼而產(chǎn)生的,因此,Java就很聰明地認(rèn)為把代碼塊插入到?jīng)]有this方法的構(gòu)造函數(shù)中即可,而調(diào)用其他構(gòu)造函數(shù)的則不插入,確保每個構(gòu)造函數(shù)只執(zhí)行一次構(gòu)造代碼塊。

還有一點(diǎn)需要說明,讀者千萬不要以為this是特殊情況,那super也會類似處理了。其實不會,在構(gòu)造代碼塊的處理上,super方法沒有任何特殊的地方,編譯器只是把構(gòu)造代碼塊插入到super方法之后執(zhí)行而已,僅此不同。

注意 放心地使用構(gòu)造代碼塊吧,Java已經(jīng)想你所想了。

?


本文轉(zhuǎn)自SummerChill博客園博客,原文鏈接:http://www.cnblogs.com/DreamDrive/p/5422705.html,如需轉(zhuǎn)載請自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的构造代码块会想你所想的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。