A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 静水流华 中级黑马   /  2014-8-31 17:15  /  1814 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test {
        public static void main(String[] args) {
                String n = 3;
                System.out.println("Before change, n = " + n);
                changeData(n);
                System.out.println("After changeData(n), n = " + n);
        }      

        public static void changeData(String nn) {
                nn = 10;
        }
}
结果为:
Before change, n = 3
After changeData(n), n = 3
问:为什么是怎样的转出结果能给我详细讲解一下吗?实际上我对对象在内存中的建立引用问题还是不是很清楚。希望指点迷津


9 个回复

倒序浏览
打印输出中隐藏着 toString()这个方法    一般都不用重写  
回复 使用道具 举报
花开彼岸天 发表于 2014-8-31 17:24
打印输出中隐藏着 toString()这个方法    一般都不用重写

你没有明白我的问题
回复 使用道具 举报
静水流华 发表于 2014-8-31 18:06
你没有明白我的问题

我的问题是他的运行结果为什么都是3
回复 使用道具 举报
静水流华 发表于 2014-8-31 18:07
我的问题是他的运行结果为什么都是3

String n=3;
System.out.println("Before change, n = " + n);

结果不是3啊   是字符串   你这打印的等于是两个 字符串  “”+“”
回复 使用道具 举报
为什么不是3?每次都获取n的值。changeData方法也只是将10赋给nn。
回复 使用道具 举报
付江涛 发表于 2014-8-31 18:57
为什么不是3?每次都获取n的值。changeData方法也只是将10赋给nn。

这个程序String n=3,就是错的(报错了),不好意思啦应该改为String n="3";nn="10";
但是changeData(n);没什么用,那么函数在内存中是怎样被执行的呢?是不是虚拟机读到这句话时就将就函数changeData(String nn){}加载到栈,并开辟一片内存为形参的参数nn (名字为nn值为"3"),当程序读到nn="10";时将名字为nn的那片内存中的值换为了“10”
回复 使用道具 举报
这就是java中值传递的造成的原因:java中只有值传递,没有引用传递,程序在将实参传递给形参的时候只是传递了实参的一个拷贝,程序在方法中对形参的改变并不影响实参。如果参数是对象的引用,那么传递的就是对象引用的拷贝,与原引用指向同一对象。你这题比较特殊,都是字符串,你知道的,字符串是不可变的,是final的。所有对String的操作程序会在堆中新建一个对象,然后String对象引用的副本指向了这个新String对象,与原来的String对象无关。
回复 使用道具 举报 1 0
String 类型传入的不是字符串能运行?楼主搞错了吧
回复 使用道具 举报
public static void changeData(String nn) {
                nn = 10;
        }
里面的nn的值就没传出去,n还是3
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马