黑马程序员技术交流社区

标题: 为什么啊,求解释 [打印本页]

作者: 张东贤    时间: 2013-3-26 21:43
标题: 为什么啊,求解释
本帖最后由 张东贤 于 2013-3-27 12:52 编辑

publicclass Test1 {

    publicstaticvoid changeStr(String str){
        str="welcome";
    }
    publicstaticvoid main(String[] args) {

        String str="1234";
        changeStr(str);
        System.out.println(str);
    }
}


输出是1234
作者: 我是小白    时间: 2013-3-26 21:48
changeStr()虽然对String做了运算,但是返回类型第void,没有返回值,所以打印的还是原值
作者: 高顺德    时间: 2013-3-26 21:54
在java中都是值传递 你在main方法中传过去的str是main方法的局部变量 当时在栈的值是一个内存地址  地址指向的是堆中的“1234” 所以传过去的只是个地址 然后你把这个地址改成了“welcome” 等方法又返回到main方法中的时候 读出 的还是main方法当前的局部变量str的值所以是“1234”了


作者: 郭金龙    时间: 2013-3-26 22:05
一图以蔽之

无标题.png (32.84 KB, 下载次数: 31)

无标题.png

作者: strawberry2013    时间: 2013-3-26 22:24
public class Test1{

    public static void changeStr(String str){
        str="welcome";                        //此处str指针指向了"welcome"
    }
    publicstaticvoid main(String[] args) {

        String str="1234";                 //此处new一个对象"1234"
        changeStr(str);                        //此处将"1234"对象的地址传给changeStr()
        System.out.println(str);
    }
}

综上, str指向了对象"welcome",故打印为str指向的对象信息
实际上,"1234"分配内存空间仍然存在,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间
作者: yufeng47    时间: 2013-3-26 22:36
changeStr(String str):中的str是一个局部变量,main方法中的str也是一个局部变量,将main中的str地址传递到changeStr(String str)中,仅仅是改变了这个局部变量str的地址值,及:str="welcome",但是没有将改地址返回给main中的str,所以这两个str指向的地址不是同一个。
即使changeStr(String str)有返回值String,如果不用str来接收返回的地址,那么对main中的局部变量str也不会有影响,最只要的是他们不是同一个引用。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2