黑马程序员技术交流社区

标题: 输出结果是多少 [打印本页]

作者: BlackHorse001    时间: 2015-9-2 08:01
标题: 输出结果是多少
public class Test1 {

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

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

作者: a80C51    时间: 2015-9-2 08:04
静待大神前来解答。
作者: cc3441251    时间: 2015-9-2 08:06
为什么输出1234?
作者: 心之谷96    时间: 2015-9-2 08:28
  changeStr(str) 只是调用上面的静态方法,但这个方法没有返回语句,即使welcome赋值成功他也返回不到主函数中来。。。。。。。。
作者: 路宪帅    时间: 2015-9-2 08:28
我认为是  changeStr(str); 只是把str传进来,在changeStr方法内改变str为“welcome”,但并没有把改变的值返回给str,所以str还是原先的值
作者: lostyou    时间: 2015-9-2 12:46
兄弟 你得搞清楚你输出的变量是在哪个范围(作用域)的变量啊
作者: ln0491    时间: 2015-9-2 12:54
1234........
作者: 牛小爽    时间: 2015-9-2 19:07
1234……调用的函数是void类型,不返回返回值
作者: 要踏实小伙子    时间: 2015-9-2 19:18
牛小爽 发表于 2015-9-2 19:07
1234……调用的函数是void类型,不返回返回值

经测试,此说法不对,返回了也是输出1234
作者: 王海彬    时间: 2015-9-2 19:25
哥们,你先想清楚方法是谁调用方法就把返回值传给调用者,但是你这个方法的返回值类型是void,也就是不会返回返回值,所以是1234,如果你把返回类型改为 String ,看看就知道怎么回事了!
作者: 寰宇天侠    时间: 2015-9-2 19:29
String str1一开始指向1234,然后调用函数,新建一个str2跟str1一样指向1234,然后把str2指向welcome,然并卵,跟str1没关系,所以str1还是1234
如果想反悔welcom,可以str=changeStr(str);  并把change改成能返回String
作者: 牛小爽    时间: 2015-9-2 19:29
要踏实小伙子 发表于 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”
作者: jeska    时间: 2015-9-2 19:30
不知道,啊
作者: 再见_悟空    时间: 2015-9-2 19:31
不用想了,字符串必然是1234,不会改变的,你划一下内存图就很明朗了,
作者: qq840570226    时间: 2015-9-2 19:38
1234 有问题吗?
作者: 再见_悟空    时间: 2015-9-2 20:16
首先,假如你这个是一个整形变量,你觉得会变吗?局部变量的作用域?
第二个,字符串是存储在方法区的常量池里面,你的main方法里面这个str就指向了常量池的“1234”,
然后,changeStr(str);调用changeStr方法,创建的是一个新的局部变量str,使用完了就释放了,main里面的str还是指向“1234”

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

最后问你一句,你认为你的这条语句  changeStr(str);  等价于str = "welcome"; 吗?

作者: MengYa    时间: 2015-9-2 20:28
注意void就知道答案了,没有返回所以字符串还是1234
作者: forjunjian    时间: 2015-9-2 22:34
1234  因为String是不会变的,任何改变String类型 都会产生一个新的String对象,这里的引用对象str指向的是常量池里面的对象,没有对对象的引用作出改变,那么还是指向对应的常量池里的对象,而常量池里面的常量,在编译的时候已经决定了,是不会改变的。所以String还是不变。
作者: hellojavacode    时间: 2015-9-2 22:47
因为changeStr中的那个str是个局部变量,不会被所有方法所共享。所以输出还是1234
作者: 哈哈哈欠虫    时间: 2015-9-3 13:49
还是1234啊,str只是把值传到函数里
作者: BlackHorse001    时间: 2015-9-4 09:30
要踏实小伙子 发表于 2015-9-2 19:18
经测试,此说法不对,返回了也是输出1234

应该就是局部变量作用域的问题,str的值即使赋值成功也不可能被main获取,只在changStr中有效
作者: BlackHorse001    时间: 2015-9-4 09:35
再见_悟空 发表于 2015-9-2 20:16
首先,假如你这个是一个整形变量,你觉得会变吗?局部变量的作用域?
第二个,字符串是存储在方法区的常量 ...

为什么main里的str=“1234”就成常量了?
作者: l631356126    时间: 2015-9-4 09:47
结果只有1234.。。。。

class Test1 {

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

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

这样输出结果是
welcome
1234




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