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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© BlackHorse001 中级黑马   /  2015-9-2 08:01  /  1266 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Test1 {

    publicstaticvoid changeStr(String str){
        str="welcome";
    }
    publicstaticvoid main(String[] args) {

        String str="1234";
        changeStr(str);
        System.out.println(str);
    }
}

25 个回复

倒序浏览
a80C51 来自手机 中级黑马 2015-9-2 08:04:10
沙发
静待大神前来解答。
回复 使用道具 举报
为什么输出1234?
回复 使用道具 举报
  changeStr(str) 只是调用上面的静态方法,但这个方法没有返回语句,即使welcome赋值成功他也返回不到主函数中来。。。。。。。。
回复 使用道具 举报
我认为是  changeStr(str); 只是把str传进来,在changeStr方法内改变str为“welcome”,但并没有把改变的值返回给str,所以str还是原先的值
回复 使用道具 举报
兄弟 你得搞清楚你输出的变量是在哪个范围(作用域)的变量啊
回复 使用道具 举报
1234........
回复 使用道具 举报
1234……调用的函数是void类型,不返回返回值
回复 使用道具 举报
牛小爽 发表于 2015-9-2 19:07
1234……调用的函数是void类型,不返回返回值

经测试,此说法不对,返回了也是输出1234
回复 使用道具 举报
哥们,你先想清楚方法是谁调用方法就把返回值传给调用者,但是你这个方法的返回值类型是void,也就是不会返回返回值,所以是1234,如果你把返回类型改为 String ,看看就知道怎么回事了!
回复 使用道具 举报
String str1一开始指向1234,然后调用函数,新建一个str2跟str1一样指向1234,然后把str2指向welcome,然并卵,跟str1没关系,所以str1还是1234
如果想反悔welcom,可以str=changeStr(str);  并把change改成能返回String
回复 使用道具 举报
要踏实小伙子 发表于 2015-9-2 19:18
经测试,此说法不对,返回了也是输出1234

首先执行main函数里面的 String str="1234"; changeStr(str);然后将main方法"1234"当做参数传进changeStr方法中, changeStr方法中的 str="welcome";被“1234”替换了,最后main方法和changeStr方法里面的str都是“1234”,输出的str就是“1234”
回复 使用道具 举报
不知道,啊
回复 使用道具 举报
不用想了,字符串必然是1234,不会改变的,你划一下内存图就很明朗了,
回复 使用道具 举报
1234 有问题吗?
回复 使用道具 举报
首先,假如你这个是一个整形变量,你觉得会变吗?局部变量的作用域?
第二个,字符串是存储在方法区的常量池里面,你的main方法里面这个str就指向了常量池的“1234”,
然后,changeStr(str);调用changeStr方法,创建的是一个新的局部变量str,使用完了就释放了,main里面的str还是指向“1234”

再者:在Java中由于有基本类型形参不可能改变实参,引用类型的形参可以改变形参,这确实是的,但是字符串是存储在常量池中,假如写了这一句,String str = new String("1234"); 那么str指向堆内存的一个对象,这个对象里面又存着指向常量池“1234”的地址,而,str = “1234”;会直接指向常量池,

最后问你一句,你认为你的这条语句  changeStr(str);  等价于str = "welcome"; 吗?
回复 使用道具 举报
注意void就知道答案了,没有返回所以字符串还是1234
回复 使用道具 举报
1234  因为String是不会变的,任何改变String类型 都会产生一个新的String对象,这里的引用对象str指向的是常量池里面的对象,没有对对象的引用作出改变,那么还是指向对应的常量池里的对象,而常量池里面的常量,在编译的时候已经决定了,是不会改变的。所以String还是不变。
回复 使用道具 举报
因为changeStr中的那个str是个局部变量,不会被所有方法所共享。所以输出还是1234
回复 使用道具 举报
还是1234啊,str只是把值传到函数里
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马