详细解决方案
关于 java 引述传递和值传递,你的知否
热度:2136 发布时间:2013-02-25 21:06:55
为什么sun要这么 做
public class Test03 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("good");
StringBuffer s2 = new StringBuffer("bad");
test(s, s2);
System.out.println(s);// 9 goodhah这里为什么是 goodhah
System.out.println(s2);// 10 bad
但这里为什么是 bad
}
static void test(StringBuffer s, StringBuffer s2) { // 此
System.out.println("s="+s);// 1 good
System.out.println("s2="+s2);// 2 bad
s2 = s;// 3
s = new StringBuffer("new");// 4
System.out.println("s="+s);// 5 new
System.out.println("s2="+s2);// 6 good
s.append("hah");// 7goodhah
s2.append("hah");// 8
System.out.println("s="+s+">>>>>>>>>");// 9 newhah
System.out.println("s2="+s2+">>>>>>>>>");// 10 goodhah
}
高手们解答 一下楼主看下这篇帖子 你会受益匪浅
http://bbs.csdn.net/topics/390245117楼主不要想太复杂了。记住一点:JAVA只有值传递。只不过像引用类型传的是地址值,而接受地址值的变量就能够访问这个对象,所以只是看起来像是引用传递。
在你给的例子里边,test()方法里从 “s2 = s”一句开始,test()里不在有变量持有main()中的s2的地址,所以不论后边怎么改变,main()中的s2都是"bad"。而main()中的s的地址值赋给了test()中的s2,所以s的值就是test()中s2最后的值答案是 java中只有值传递这个其实可以从变量的有效范围解释
把你的代码稍作修改
static void test(StringBuffer s, StringBuffer s2) { // 此
System.out.println("s=" + s);// 1 good
System.out.println("s2=" + s2);// 2 bad
s2 = s;// 3
s = new StringBuffer("new");// 4简单来说 就是,变量是变量 , 值是值。java 都是值传递。。。引用传的地址的值。
分析一下你的例子:
s2 = s;// 3 s2指向了s的地址
s = new StringBuffer("new");// 4 s指向了另外一个新的地址
所以这一句:s2.append("hah");// 8,它才是改变了原始的s值的“罪魁祸首”,你把它改成s2.append("i am s1"); 看看输出,会看得更明白。
至于7中对s的操作,此s已非main中的s,当然不会影响main中的s值。
不知道我有没有说得更明白些。。。。。
java 都是值传递。。。引用传的地址的值而已
java基础是最难的 磨刀不误砍柴工你既然会提出这个问题,那么我的解释相信你也还是会云里雾里。
我给你剖析下以下这行代码,你再重新分析过代码。
StringBuffer s = new StringBuffer("good");
1、在jvm中的栈里创建了一个变量s
2、在jvm中的堆里创建了一个StringBuffer对象的区域,里面存有值“good”
3、变量s的引用指向上述2所创建的堆区域
也就是说在jvm里s和new StringBuffer("good")是分开的,这也是解除你疑惑的关键点
再给你剖析下s2 = s;这行代码:
s2这个变量的引用指向s这个变量的引用
相关解决方案
- java 乱码 汉字是 ? 如何转换成汉字
- java web 登录次数限制,该如何解决
- java 工商银行网银支付 B2B的 都亟需什么,需要注意什么
- Java Applet程序从JDK6升级到7时遇到的有关问题
- java web 视频相干
- java 系统单点登录解决方案
- java.lang.NumberFormatException: For input string: "id"该如何处理
- java.lang.NoSuchMethodException: setId([Ljava.lang.String;)解决方法
- java 获取客户端IP解决办法
- JAVA 后台怎么获得前台页面FCKedit编辑器中的内容以及内容的样式
- java 正则化匹配有关问题
- java web 受阻
- java.lang.IllegalStateException: No output folder,该怎么解决
- java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.makeAccess,该如何解决
- java 乱码有关问题 急求大神
- java EE错误如何解决阿,都是过了,没有能解决的!
- java 工程打包有关问题 多谢各位大神!多谢
- JAVA WEB导航条,该怎么处理
- java.sql.SQLException: Access denied for user 'root'@'localhost' (using password,该如何处理
- java 中Node 有关问题
- 关于 java 引述传递和值传递,你的知否
- Java Web 学习中有关问题,请高手指教
- java web中的url地址小疑点。
- java web开发解决办法
- java.lang.NullPointerException解决方法
- 关于 java cast 有关问题,你明白不
- java ftp 下传和上载乱码有关问题
- java web项目上的一些文件
- Java rmi 抛出各种错误
- Hibernate操作数据库 报错java.lang.Integer cannot be cast to java.lang.String如何改