Java?參數(shù)值傳遞機(jī)制的實(shí)現(xiàn)
一個(gè)很經(jīng)典的問(wèn)題: java的方法入?yún)?是值傳遞還是地址傳遞?
答案是:值傳遞。
今天排查一個(gè)生產(chǎn)問(wèn)題,數(shù)據(jù)庫(kù)鏈接資源沒(méi)有關(guān)閉。
大致代碼邏輯如下:
try{ Preparestatement ps = null; String sql = "select * from tableA where id=?"; this.query(ps,sql); }catch(Exception e){ logger.error("error:",e); }finally{ if(ps!=null){ ps.close(); } } private void query(Preparestatement ps ,String sql){ ps = this.getPreparestatement(); ........//不重要的查詢邏輯 }
可以看到 對(duì)象實(shí)例 ps 被傳到了一個(gè)私有方法:query(Preparestatement ps ,String sql) 里,并在方法里面進(jìn)行賦值。然后在方法外進(jìn)行判空關(guān)閉。
很明顯,這段代碼的作者,并不熟悉JAVA的值傳遞機(jī)制,雖然ps被傳到方法里賦值,但是方法外的ps對(duì)象依然還是null,所以finally模塊里的代碼并沒(méi)有執(zhí)行close。只是表面看起來(lái)會(huì)關(guān)閉資源。
實(shí)際上,方法外的ps,和方法里面的ps 并不是同一個(gè)對(duì)象,或者說(shuō)并不是指向同一個(gè)地址。java傳遞的是值而不是地址。這是和C語(yǔ)言最大的區(qū)別。
Java可以在方法里修改對(duì)象的屬性(如 a.setName("myName")),這種修改是可以影響到方法外的對(duì)象,但是并不能通過(guò)=號(hào),對(duì)對(duì)象進(jìn)行重新賦值來(lái)影響方法外的對(duì)象(如a=getNewObject())。
到此這篇關(guān)于Java 參數(shù)值傳遞機(jī)制的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 參數(shù)值傳遞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis分頁(yè)插件PageHelper手寫實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Mybatis分頁(yè)插件PageHelper手寫實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案
這篇文章主要給大家介紹了關(guān)于Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案,這個(gè)異常是java.net包中的一部分,具體說(shuō)它是類的一個(gè)實(shí)例,異常通常是由主機(jī)名無(wú)法解析為IP地址引起的,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01MybatisPlus批量保存原理及失效原因排查全過(guò)程
這篇文章主要介紹了MybatisPlus批量保存原理及失效原因排查全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01java 使用簡(jiǎn)單的demo實(shí)例告訴你優(yōu)化算法的強(qiáng)大
本篇文章介紹了,在java中使用簡(jiǎn)單的demo實(shí)例告訴你優(yōu)化算法的強(qiáng)大。需要的朋友參考下2013-05-05