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