国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java方法傳遞引用、傳遞基本類型

2019-11-06 06:04:52
字體:
來源:轉載
供稿:網友

今天做項目遇到兩個很有意思的問題,有三個int類型的計數器,通過一大坨ifelse來分類對計數器進行累加。

由于這坨ifelse太大了,所以我把它extract了一下,refactor到了一個新的PRivate方法中,把計數器傳到該方法里進行更新。然而在方法快要完成的時候突然意識到,java傳遞基本類型只是傳值,方法內部改變不了外部的計數器的值。差點挖了坑,因此創建了一個包裝類:

private class IntWrapper{ public int value; public IntWrapper(int value) { this.value = value; }}

然后傳遞給private方法 IntWrapper 對象,在方法內部可以對外部包裝對象計數器進行累加:

intWrapper.value++;

這樣就可以更新外部計數器的值了。

和C中傳遞指針有些相似。

然后我又抽取了另外的一大坨ifelse生成一個新的方法,需要給該方法傳遞一個BigDecimal類型的對象,然后方法內部對該對象進行累加更新:

private methodAfterRefactor(BigDecimal amount){ if(xxx){ amount = amount.add(new BigDecimal(567));//1 }}

剛開始沒發現不對勁,可是仔細思考了一下,發現坑了:

java語言中所有參數都是按值傳遞的,注釋1處的add方法返回了一個新的 BigDecimal 對象,將新對象的地址賦值給方法局部引用變量amount,這一系列操作完全沒有影響到外部 BigDecimal 對象。沒有改變它的域值,也沒有改變它指向的對象(引用變量值)。

思索了一下,我又創建了一個 BigDecimal 的包裹類:

private class BigDecimalWrapper{ public BigDecimal value; public BigDecimalWrapper(){ value= new BigDecimal(0); }}

然后抽取出來的方法變成了這樣:

private methodAfterRefactor(BigDecimalWrapper wrapper){ if(xxx){ wrapper.value = wrapper.value.add(new BigDecimal(567));//1 }}

這樣就能成功地修改到方法外部引用的值了。

這是不是指針的指針有些相似呢…


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽中县| 崇明县| 平顶山市| 弥勒县| 二连浩特市| 高州市| 廉江市| 军事| 乐清市| 竹山县| 北宁市| 伊金霍洛旗| 山阴县| 藁城市| 贵南县| 大方县| 澄江县| 郧西县| 麻栗坡县| 贵溪市| 家居| 治县。| 玉树县| 寻乌县| 鹰潭市| 友谊县| 平乐县| 惠水县| 双江| 永福县| 安吉县| 叶城县| 洛扎县| 黄石市| 桐乡市| 旬邑县| 都兰县| 旬邑县| 沙坪坝区| 民勤县| 贞丰县|