当前位置: 首页 > news >正文

Java 参数值传递机制

一个很经典的问题: java的方法入参 是值传递还是地址传递?

答案是:值传递。

今天排查一个生产问题,数据库链接资源没有关闭。

大致代码逻辑如下:

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();........//不重要的查询逻辑
}

可以看到 对象实例 ps 被传到了一个私有方法:query(Preparestatement ps ,String sql) 里,并在方法里面进行赋值。然后在方法外进行判空关闭。

很明显,这段代码的作者,并不熟悉JAVA的值传递机制,虽然ps被传到方法里赋值,但是方法外的ps对象依然还是null,所以finally模块里的代码并没有执行close。只是表面看起来会关闭资源。

实际上,方法外的ps,和方法里面的ps 并不是同一个对象,或者说并不是指向同一个地址。java传递的是值而不是地址。这是和C语言最大的区别。

Java可以在方法里修改对象的属性(如 a.setName("myName")),这种修改是可以影响到方法外的对象,但是并不能通过=号,对对象进行重新赋值来影响方法外的对象(如a=getNewObject())

http://www.xdnf.cn/news/563725.html

相关文章:

  • 全平台开源电子书阅读器推荐,支持多端同步+AI朗读!支持epub/mobi/azw3/pdf常见电子书格式!
  • PostgreSQL基础操作
  • 29.第二阶段x64游戏实战-技能冷却
  • Node.js 24发布:性能与安全双提升
  • 【Vue篇】重剑无锋:面经PC项目工程化实战面经全解
  • 苹果企业签名为什么会出现授信异常
  • 《从虚拟 DOM 到 Diff 算法:深度解析前端高效更新的核心原理》-简版
  • logits是啥、傅里叶变换
  • day 32
  • 谷歌I/O 2025 完全指南:由Gemini开创的AI新时代及其对我们未来的影响
  • DevExpress Blazor中文教程 - 如何用AI聊天组件构建大型语言模型聊天APP?
  • vscode连接本地Ubuntu
  • OBOO鸥柏丨AI数字人触摸屏查询触控人脸识别语音交互一体机上市
  • SpringCloud(二)
  • Unity-编辑器扩展-其二
  • 电子电气架构 --- 细化造车阶段流程
  • 第一性原理(First Principles Thinking)——颠覆性创新的底层逻辑
  • LM-BFF——语言模型微调新范式
  • vscode打开的文件被覆盖/只能打开两个文件(Visual Studio Code)
  • 基于Resnet-34的树叶分类(李沐深度学习基础竞赛)
  • WebRTC与RTSP|RTMP的技术对比:低延迟与稳定性如何决定音视频直播的未来
  • 缓存穿透、缓存击穿、缓存雪崩解决方案
  • NIFI的处理器:JSLTTransformJSON 2.4.0
  • 第19天-Python自动化生成PPT图文教程(基于python-pptx)
  • Python 训练营打卡 Day 31
  • Sign签证绕过
  • MyBatis 关联映射与多表查询实战教程
  • 人工智能在生物医学研究中的创新应用
  • 基于两阶段交互控制框架的互联多能系统协同自治优化
  • JVM 与容器化部署调优实践(Docker + K8s)