当前位置: 首页 > 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())

相关文章:

  • 采用线性优化改进评估配电网的灵活性范围
  • docker-compose使用详解
  • Unity中SRP Batcher使用整理
  • BeamDojo: Learning Agile Humanoid Locomotion on Sparse Footholds
  • 【深度估计 Depth Estimation】数据集介绍
  • 静态方法和实例方法的区别
  • NVIDIA GPU 性能调优与诊断完全指南
  • PortgreSQL常用操作
  • shell脚本总结3
  • 网络安全管理之钓鱼演练应急预案
  • Python 训练营打卡 Day 31
  • Dirsearch 深度使用教程:从基础扫描到携带 Cookie 探索网站
  • Java—— IO流 第二期
  • PCB设计实践(二十三)什么是阻抗匹配,需要做啥
  • springboot链接nacos测试
  • 项目执行中缺乏风险管理,如何预防潜在问题?
  • 惠斯通电桥测量 数据采集模块 支持恒压/恒流的24位ADC电桥测量
  • PCB设计教程【入门篇】——电路分析基础-元件数据手册
  • 设计模式介绍
  • 解除diffusers库的prompt长度限制(SDXL版)
  • c# java 网站开发/软文标题写作技巧
  • 网站建设项目延期验收申请/搭建网站流程
  • 微商做网站/企业关键词优化公司
  • 摄影网站的意义/百度搜索广告
  • 长春网站优化/天津关键词优化专家