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 被传到了一个python私有方法:query(Preparestatement ps ,String sql) 里,并在方法里面进行赋值。然后在方法外进行判空关闭。
很明显,这段代码的作者,并不熟悉JAVA的值传递机制,虽然ps被传到方法里赋值,但是方法外的ps对象依然还是null,所以finally模块http://www.devze.com里的代码并没有执行close。只是表面看起来会关闭资源。
实际上,方法外的ps,和方法里面的ps 并不是同一个对象,或者说并不是指向javascript同一个地址。java传递的是值而不是地址。这是和C语言最大的区别。
Java可以在方法里修改对象的属性(如 a.setName("myName")),这种修改是可以影响到方法外的对象,但是并不能通过=号,对对象进行重新赋值来影响方法外的对象(如a=getNewObject())。
到此这篇关于Java 参数值传递机制的实现的文章就介绍到这了,更多相关Java 参数值传递内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相python关文章希望大家以后多多支持编程客栈(www.cppcns.csEqUTEQsom)!
精彩评论