黑马程序员技术交流社区

标题: static方法 问题? [打印本页]

作者: 崔朋朋    时间: 2012-9-12 10:52
标题: static方法 问题?
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 吗?
作者: 陈俊来    时间: 2012-9-12 10:57
   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);
    }
作者: 徐传任    时间: 2012-9-12 10:58
不是的,结果就是1234,因为string类一经初始化之后就不可以改变,所以你不能通过定义的changeStr方法来改变str的值
作者: 陈俊来    时间: 2012-9-12 11:00
徐传任 发表于 2012-9-12 10:58
不是的,结果就是1234,因为string类一经初始化之后就不可以改变,所以你不能通过定义的changeStr方法来改 ...

哦,原来是这个样子啊
作者: 陈俊来    时间: 2012-9-12 11:02
徐传任 发表于 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);
    }
作者: 张 涛    时间: 2012-9-12 11:03
是这样的,结合内存分析,把执行过程缕一下:
首先在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:11
陈俊来 发表于 2012-9-12 11:02
那为什么这样也不行啊?

public void changeStr(String str){

String str = "1234";
test1.changeStr(str);
你把str作为参数传递给changeStr这个函数,但是str已经指向了"1234"这个字符串,因为string类一旦初始化之后就不可以改变了,所以str会一直是1234.只要记住string类初始化后就不能改变就可以了
作者: 焦晨光    时间: 2012-9-12 11:19
有图有真相






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