注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

Java中的“pass by value"(传值)  

2011-10-11 13:27:21|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原本我一直以为Java是有“值传递”(pass by value)和“引用传递”(pass by reference)之分的。直到今天在Android一段代码上发现了问题,才知道Java是严格的“pass by value”,基础不扎实啊。
关于Java的传值,《重构》(<Refactoring: Improving the Design of Existing Code>)的第六章(Remove Assignments to Parameters)里有很简单的一个例子,摘抄如下:

Java中使用“pass by value"[函数调用]方式,这常常造成许多人迷惑。在所有地点,Java都使用严格采用pass by value,所以下列程序:
class Param {
        public static void main (String [] args){
                int x = 5;
                triple(x);
                System.out.println("x after triple : "+ x);
        }
        private static void triple (int arg)
        {
                arg = arg * 3;
                System.out.println("arg in triple :"+ arg);
        }
}

会产生这样的输出:
arg in triple : 15
x  after triple : 5

这段代码不致于让人糊涂。但如果参数中传递的是对象,就可能把人弄迷糊了。
如果我在程序中以Date对象表示日期,那么下列程序:
class Param {
        public static void main (String [] args){
                Date d1 = new Date("1 Apr 98");
                nextDateUpdate(d1);
                System.out.println("d1 after nextDay: " + d1);
                
                Date d2 = new Date("1 Apr 98");
                nextDateReplace(d2);
                System.out.println("d2 after nextDay: " + d2);
        }
        private static void nextDateUpdate (Date arg) {
                arg.setDate( arg.getDate() + 1);
                System.out.println("arg in nextDay : " + arg);
        }
        private static void nextDateReplace (Date arg) {
                arg = new Date(arg.getYear(),arg.getMonth(),arg.getDate()+1);
                System.out.println("arg in nextDay : " + arg);
        }
}

产生的输出:
arg in nextDay : Thu Apr 02 00:00:00 CST 1998
d1 after nextDay: Thu Apr 02 00:00:00 CST 1998
arg in nextDay : Thu Apr 02 00:00:00 CST 1998
d2 after nextDay: Wed Apr 01 00:00:00 CST 1998

从本质上说,object reference 是按值传递的(pass by value)。因此我可以修改参数对象的内部状态,但参数对象重新赋值,没有意义。
Java1.1及其后版本,允许你将参数标示为final,从而避免函数中对参数赋值。即使某个参数被标示为final,你仍然可以修改它所指向的对象。
  评论这张
 
阅读(1395)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017