黑马程序员技术交流社区

标题: 帮忙看下哪出错了?为什么出错? [打印本页]

作者: chuanyueing    时间: 2013-3-5 10:22
标题: 帮忙看下哪出错了?为什么出错?
  1. public class Demo0 {
  2. public static void main(String[] args){
  3.                 String s = "welcome";
  4.                 s += " to";
  5.                 s.concat(" java");//为什么没有连接上呢?   我的困惑之处;
  6.                    System.out.println(s);//输出 welcome to

  7.                 System.out.println(s.concat(" 2java"));
  8.                 //输出 welcome to 2java  ,这时候为什么就连接上了呢?
  9.          }
  10. }
复制代码

作者: Gaara    时间: 2013-3-5 10:29
System.out.println(s);

这句输出的是s

而s只是 welcome to

s.concat(" java");这句并没有赋给s

改成s = s.concat(" java");  就好了
作者: 克零岚    时间: 2013-3-5 10:43
concat是String类的一个方法,返回值是String类型(public String concat(String str) ,意思是将指定字符串连接到此字符串的结尾,创建一个新的字符串
你程序里的 s.concat(" java")并没有接收方法返回来的字符串,所以你输出的s还是原来的字符串"welcome";而System.out.println(s.concat(" 2java"))可以,那是因为System.out.println()接收了方法返回来的新字符串,打印的是新字符串。

作者: 张卫刚    时间: 2013-3-5 10:48
同学回答的没错,我就没说的了
作者: 邹学良    时间: 2013-3-5 11:21
本帖最后由 邹学良 于 2013-3-5 11:24 编辑

String是静态数组类,一旦确定就无法加长,S+=“to"是新创建了一个S对象S,并不是楼上说的赋值
s.concat(" java")只有方法执行但并没有让去接收返回值
s.concat(" 2java")相当于新创建对象 Strint S= new String(原来的对象S+“2java"),打印的是新建对象
作者: 杨杨    时间: 2013-3-5 12:01
刚开始的时候我也有这样的疑惑 在java中这样的例子不止这一个 ,一般这种方法是说的他们的返回值 是他们做了改变后的结果,而不是在原来对象上做改变。原因是 能体会到就是说不出来的感觉。慢慢体会吧。
作者: 杨剑    时间: 2013-3-5 13:01
s.concat的值没有赋值给s,s变量原来的值还是welcome to,字符串只要一定义,就不能被改变
比如:就像你说的那个例子执行这个语句String s = "welcome",s指向常量池中的字符串"welcome",
执行s+="to"时,相当于welcome+to等于welcome to此时s为welcome to,原来的welcome字符串仍然在常量池中,没被对象引用了,执行下面的代码也是同样的道理。
作者: 张权    时间: 2013-3-5 13:38
邹学良 发表于 2013-3-5 11:21
String是静态数组类,一旦确定就无法加长,S+=“to"是新创建了一个S对象S,并不是楼上说的赋值
s.concat(" j ...

楼上说的赋值应该是指  s.concat(" java")没有赋值
作者: 彭波    时间: 2013-3-5 13:49
public class Demo0 {

public static void main(String[] args){

                String s = "welcome";

                s += " to";

                s = s.concat(" java");//此处加赋值语句

                   System.out.println(s);//输出 welcome to java

                System.out.println(s.concat(" 2java"));

                //输出 welcome to 2java  

         }

}

作者: 张权    时间: 2013-3-5 15:04
看了一下上面的回答,都回答很正确,不过这个问题我以前也迷惑过,所以我再来解释一下吧:
class Demo {
        public static void main(String[] args) {
                String s = "welcome";
                s += " to";//这里如楼上所说,是创建了一个新的对象s ,而这个s的值是 welcome to
                               //接下来,你的代码是s.concat(" java"),这里意思是把 welcome to 连上java,这里其实又创建了一个新的对象
                //s = s.concat(" java");//注意我这里和你的源代码的区别,我在这里相当创建一个新对象,并把这个值赋给了S,打印S,就得到
                                //welcome to java,而你的代码s.concat("java")确实加了java,但这是一个新的对象,但是你并没有赋值给s,所以打印的结果当然是
                              //你之前的对象s 啊,也就是welcome to.
                                 s = s.concat(" java");
                System.out.println(s);//打印结果是welcome to java
                              
                System.out.println(s.concat(" 2java"));//至于这个,因为你打印的就是s.concat(" 2java")),当然能打印出来啊

        }
}
作者: 克零岚    时间: 2013-3-5 15:26
克零岚 发表于 2013-3-5 10:43
concat是String类的一个方法,返回值是String类型(public String concat(String str) ,意思是将指定字符 ...

:Q  人家喜欢技术分嘛  干嘛给金币




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