Java?參數(shù)值傳遞機(jī)制的實(shí)現(xiàn)
一個(gè)很經(jīng)典的問題: java的方法入?yún)?是值傳遞還是地址傳遞?
答案是:值傳遞。
今天排查一個(gè)生產(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 被傳到了一個(gè)私有方法:query(Preparestatement ps ,String sql) 里,并在方法里面進(jìn)行賦值。然后在方法外進(jìn)行判空關(guān)閉。
很明顯,這段代碼的作者,并不熟悉JAVA的值傳遞機(jī)制,雖然ps被傳到方法里賦值,但是方法外的ps對象依然還是null,所以finally模塊里的代碼并沒有執(zhí)行close。只是表面看起來會(huì)關(guān)閉資源。
實(shí)際上,方法外的ps,和方法里面的ps 并不是同一個(gè)對象,或者說并不是指向同一個(gè)地址。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)文章
Spring Boot 全局異常處理策略設(shè)計(jì)之@ExceptionHandler 與&nb
SpringBoot全局異常處理策略設(shè)計(jì)@ExceptionHandler與@ControllerAdvice生效原理源碼解析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2026-01-01
詳解如何在Java項(xiàng)目中實(shí)現(xiàn)信號的連續(xù)接收
在Java項(xiàng)目中,信號的連續(xù)接收是一項(xiàng)重要的任務(wù),特別是在處理異步事件或者需要對外部事件做出響應(yīng)時(shí),本篇博客將介紹如何在Java項(xiàng)目中實(shí)現(xiàn)信號的連續(xù)接收,包括信號的監(jiān)聽、處理和停止等步驟,需要的朋友可以參考下2023-11-11
java中阻塞隊(duì)列和非阻塞隊(duì)列的實(shí)現(xiàn)
在Java并發(fā)編程中,阻塞隊(duì)列和非阻塞隊(duì)列是兩種主要的隊(duì)列類型,分別適用于不同的場景,了解這兩種隊(duì)列的特點(diǎn)和工作機(jī)制,可以幫助開發(fā)者更好地選擇合適的數(shù)據(jù)結(jié)構(gòu)解決并發(fā)問題2024-10-10
SpringBoot項(xiàng)目在啟動(dòng)后自動(dòng)關(guān)閉的實(shí)現(xiàn)
我們在寫spring?boot?web項(xiàng)目時(shí),有時(shí)會(huì)遇到啟動(dòng)后立即關(guān)閉的情況,?本文主要介紹了SpringBoot項(xiàng)目在啟動(dòng)后自動(dòng)關(guān)閉的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

