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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张东贤 中级黑马   /  2013-3-26 21:43  /  2071 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张东贤 于 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-27 11:12

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

倒序浏览
changeStr()虽然对String做了运算,但是返回类型第void,没有返回值,所以打印的还是原值

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
在java中都是值传递 你在main方法中传过去的str是main方法的局部变量 当时在栈的值是一个内存地址  地址指向的是堆中的“1234” 所以传过去的只是个地址 然后你把这个地址改成了“welcome” 等方法又返回到main方法中的时候 读出 的还是main方法当前的局部变量str的值所以是“1234”了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
一图以蔽之

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

无标题.png

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
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会自动释放掉为该变量分配的内存空间

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
changeStr(String str):中的str是一个局部变量,main方法中的str也是一个局部变量,将main中的str地址传递到changeStr(String str)中,仅仅是改变了这个局部变量str的地址值,及:str="welcome",但是没有将改地址返回给main中的str,所以这两个str指向的地址不是同一个。
即使changeStr(String str)有返回值String,如果不用str来接收返回的地址,那么对main中的局部变量str也不会有影响,最只要的是他们不是同一个引用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马