注册
 找回密码
 注册
江西广告网
查看: 474|回复: 0
打印 上一主题 下一主题

Java值传递与引用传递

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-2-24 10:37:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
java中没有了c++中 & 这样的引用符号,也没像c#中那样提供了out与ref 那么它是怎么做的呢 做什么事情都要去除例外的东西,String类就是此类问题的一个特殊情况 为什么特殊呢? 因为它是一个引用类型,确执行的是值传递。这样说有些抽象,还是举个例子吧 值传递: class Str { public static void main(String[] args) { int i = 900; System.out.println(i); changeInt(i); System.out.println(i); } public static void changeInt(int s) { s = 34234; } } 结果: 900 900 这就是所谓的值传递。i把自己的副本给了函数changeInt的形参,而在changeInt中虽然将s赋值34234.但是对原来的i值并没有影响,因为它所修改的只是i的copy品而已。 引用传递: class Str { public static void main(String[] args) { Yinyong y = new Yinyong(); System.out.println(y.age); changeObject(y); System.out.println(y.age); } public static void changeObject(Yinyong obj) { obj.age = 34234; } } class Yinyong { int age = 22; } 声明了个简单的类Yinyong,当把Yinyong的对象y传递给函数changeObject后,看下前后结果: 22 34234 值被改变了,这就是引用调用。 下面再看看传递String对象会发生什么结果? class Str { public static void main(String[] args) { String s = "java test"; System.out.println(s); changeString(s); System.out.println(s); } public static void changeString(String str) { str = "3gg over right"; } } 看看结果吧: java test java test 你惊奇的发现s的值并没有改变!你会问了,String不也是引用类型的吗?怎么它的值没有改变呢? 因为是这样的: String被设计为不可修改的类型,也就是对String对象的任何修改都将重新创建一个对象而放弃以前的内存空间的引用! 如上例: 比如 s指向0x2344, 当它赋值给str时str也同样指向了0x2344.而当 执行str="3gg over right"后,str指向了别的地方。也许是 0x2222或者其他,反正不是0x2344了。所以当你输出s的时候,它的值并没有被修改!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表