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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡建彪 黑马帝   /  2012-10-11 07:52  /  2547 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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
求高手们 深度解释

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1 神马都是浮云

查看全部评分

10 个回复

倒序浏览
str="welcome"属于局部变量,无法覆盖另一个局部变量String str = "1234";里的值。
记得马士兵老师说过一句话,局部变量,出了大括号就没人认识它。它的值也就是只在它静态方法体里有效

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 技术 +20

查看全部评分

回复 使用道具 举报
qhasilver 发表于 2012-10-11 08:11
str="welcome"属于局部变量,无法覆盖另一个局部变量String str = "1234";里的值。
记得马士兵老师说过一句 ...

changeStr(str); 这句话执行的时候,也就是changeStr("1234");执行的时候 是什么情况?
回复 使用道具 举报
本帖最后由 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:47 编辑

JAVA中的值传递,你调用changeStr方法时,传过去是“1234”这个值,changeStr方法只是将这个值改变为“welcome”并赋值给自己的局部变量,此举无法对主函数中的局部变量str产生任何影响。
changeStr(str)这句话,实际上等于 changeStr(“1234”)

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 技术+10

查看全部评分

回复 使用道具 举报
本帖最后由 王得新 于 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


评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 技术+10

查看全部评分

回复 使用道具 举报
胡建彪 黑马帝 2012-10-11 08:52:31
7#
王得新 发表于 2012-10-11 08:47
对比下面两种结果应该就能明白了:
第一:
public class Test {

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

    }
changeStr(str);






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