黑马程序员技术交流社区

标题: 关于staic 的一道题。 [打印本页]

作者: 胡建彪    时间: 2012-10-11 07:52
标题: 关于staic 的一道题。
public class Test {
   
    public static void changeStr(String str) {
        str="welcome";
    }
    public static void main(String[] args) {
        String str = "1234";
        changeStr(str);
        System.out.println(str);

    }
}
输出的结果是    1234
求高手们 深度解释


作者: qhasilver    时间: 2012-10-11 08:11
str="welcome"属于局部变量,无法覆盖另一个局部变量String str = "1234";里的值。
记得马士兵老师说过一句话,局部变量,出了大括号就没人认识它。它的值也就是只在它静态方法体里有效
作者: 胡建彪    时间: 2012-10-11 08:18
qhasilver 发表于 2012-10-11 08:11
str="welcome"属于局部变量,无法覆盖另一个局部变量String str = "1234";里的值。
记得马士兵老师说过一句 ...

changeStr(str); 这句话执行的时候,也就是changeStr("1234");执行的时候 是什么情况?
作者: qhasilver    时间: 2012-10-11 08:28
本帖最后由 qhasilver 于 2012-10-11 08:37 编辑
胡建彪 发表于 2012-10-11 08:18
changeStr(str); 这句话执行的时候,也就是changeStr("1234");执行的时候 是什么情况? ...

这句话执行的时候,把1234的值传给了 changStr的str ,changStr的str值被改成了 1234,在方法里,你又重新覆盖成了"welcome",但是我们要注意的是,每对大括号里的变量的值只在自己内部有效,你改了你的变量值,我的变量值是不会变的,所以main方法的str不会随着changStr方法里的str改变而改变。
作者: zczcyc0201    时间: 2012-10-11 08:38
本帖最后由 zczcyc0201 于 2012-10-11 08:47 编辑

JAVA中的值传递,你调用changeStr方法时,传过去是“1234”这个值,changeStr方法只是将这个值改变为“welcome”并赋值给自己的局部变量,此举无法对主函数中的局部变量str产生任何影响。
changeStr(str)这句话,实际上等于 changeStr(“1234”)
作者: 王得新    时间: 2012-10-11 08:47
本帖最后由 王得新 于 2012-10-11 08:51 编辑

对比下面两种结果应该就能明白了:
第一:
public class Test {
   
    public static void changeStr(String str) {
          //a.
          //str=str;
         // System.out.println("changeStr()......."+str);//此处a和b两种写法一样
         //b.
         System.out.println("changeStr()......."+str);
    }
    public static void main(String[] args) {
        String str = "1234";
        changeStr(str);
        System.out.println("main()............"+str);

    }
}
结果:
changeStr().......1234
main()............1234

第二:
public class Test {
   
    public static void changeStr(String str) {
        str="welcome";
        System.out.println("changeStr()......."+str);
    }
    public static void main(String[] args) {
        String str = "1234";
        changeStr(str);
        System.out.println("main()............"+str);

    }
}
结果:
changeStr().......welcome
main()............1234



作者: 胡建彪    时间: 2012-10-11 08:52
王得新 发表于 2012-10-11 08:47
对比下面两种结果应该就能明白了:
第一:
public class Test {

Appreciate   it.
作者: 班志国    时间: 2012-10-11 09:09
str 不是被你在主函数里改变了吗
作者: 班志国    时间: 2012-10-11 09:09
str 不是被你在主函数里改变了吗
作者: 胡高德    时间: 2012-10-11 09:31
你的两个str都是局部变量,局部变量出了在哪个类中声请就在哪个类中起作用,出了那个大括号别的类就不会认识它,你这两个是两个不相干的变量,而程序执行的时候先从主方法main开始执行,所以打印的是主方法中的str,str=1234。
作者: 唐永康    时间: 2012-10-11 13:54
首先,你要明确一点,String str = "123";在这里,“123”是一个字符对象。我画一个内存地址图给你看,一看你就明白了,给你说文字性的看半天你也看不明白。搞个简单易懂的图片再配上文字说明你应该会明白。记住,字符串一被初始化就不会被改变。而你这里打印的main方法里面的str,如果你想打印changeStr方法里面的str,可以这样做,  public static void changeStr(String str) {
        str="welcome";
System.out.println(str);

    }
changeStr(str);











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