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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔朋朋 中级黑马   /  2012-9-12 10:52  /  2018 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test1 {

    public static void changeStr(String str){
        str="welcome";
    }
    public static void main(String[] args) {

        String str="1234";
        changeStr(str);
        System.out.println(str);
    }
}
//输出结果:1234

changeStr方法和main方法都是静态方法,执行 changeStr(str); 后,不是该输出 welcome 吗?

7 个回复

倒序浏览
   public static void changeStr(String str){
        str="welcome";
        System.out.println(str);//这的str是局部变量,所以才出现这种情况    }
    public static void main(String[] args) {

        String str="1234";
        changeStr(str);
        System.out.println(str);
    }
回复 使用道具 举报
不是的,结果就是1234,因为string类一经初始化之后就不可以改变,所以你不能通过定义的changeStr方法来改变str的值
回复 使用道具 举报
徐传任 发表于 2012-9-12 10:58
不是的,结果就是1234,因为string类一经初始化之后就不可以改变,所以你不能通过定义的changeStr方法来改 ...

哦,原来是这个样子啊
回复 使用道具 举报
徐传任 发表于 2012-9-12 10:58
不是的,结果就是1234,因为string类一经初始化之后就不可以改变,所以你不能通过定义的changeStr方法来改 ...

那为什么这样也不行啊?

public void changeStr(String str){
        str="welcome";
      
    }
    public static void main(String[] args) {

        String str="1234";
        Test1 test1=new Test1();
        
        test1.changeStr(str);
        System.out.println(str);
    }
回复 使用道具 举报
是这样的,结合内存分析,把执行过程缕一下:
首先在main方法中有个局部变量str,赋值为“1234”,这是在内存中的情况是:str作为引用在栈中,字符串1234在数据区,这个str是第一个str。
然后把str传给另一个方法,那个方法的参数str,也要放在栈中,此str非原先的str,这是第二个str,传入后第二个str也指向“1234”。这时栈中就有两个str。
然后你把“welcome”给了第二个str,也就是说第二个str指向了“welcome”,“welcome”作为字符串在数据区。
然后方法结束,栈中的关于此方法的变量都要出栈,第二个str出栈。
回到main方法,打印str,当然还是第一个str的值,而这个str一直指向的都是“1234”。
明白否?

点评

厉害  发表于 2012-9-12 11:14
回复 使用道具 举报
陈俊来 发表于 2012-9-12 11:02
那为什么这样也不行啊?

public void changeStr(String str){

String str = "1234";
test1.changeStr(str);
你把str作为参数传递给changeStr这个函数,但是str已经指向了"1234"这个字符串,因为string类一旦初始化之后就不可以改变了,所以str会一直是1234.只要记住string类初始化后就不能改变就可以了
回复 使用道具 举报
有图有真相

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马