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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐宋元明清 中级黑马   /  2013-11-4 09:29  /  1182 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐宋元明清 于 2013-11-4 14:59 编辑

我手上拿到了一个测试题:写出以下代码执行结果,分析为什么?
        public class Test {
                public static void main(String[] args) {
                        String s = "abc";//把字符串abc赋值给字符串变量s
                        s.substring(1);//百度substring,得知该方法返回字符串,所以返回bc,但是这行语句是个表达式,不是完整语句。编译报错。
                        s.replace("bc", "xyz");//百度replace,得知该方法返回字符串,所以返回xyz,但是这行语句也是个表达式,不是完整语句。编译报错。
                       System.out.println(s); //打印abc,但是执行不到这行语句。
                       String value = new String ("abc");//建立String型对象 value,往对象内传参数为字符串abc。
                       System.out.println(s == value);//编译报错,不同类型。s是字符串"abc",value是引用类型变量
                }
       }
答:编译失败。
但是之后,运行测试结果为abc false 小弟不是很明白,请哪位知道的给分析下,不胜感激。


我还测试了,在JAVA语句里面只写表达式的确是错误的

不是语句.JPG (47.16 KB, 下载次数: 8)

不是语句.JPG

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 那得好好想想 于 2013-11-4 10:05 编辑

1、substring是返回一个新的字符串,它是此字符串的一个子字符串。该子字符串从指定索引处的字符开始,直到此字符串末尾。
用法如下:
"unhappy".substring(2) returns "happy"
"Harbison".substring(3) returns "bison"
"emptiness".substring(9) returns "" (an empty string)

所以你那样写是不行的哦。

2、replace是用一个新的字符替换旧的字符,然后返回一个新的字符串。例如
"mesquite in your cellar".replace('e', 'o')
         returns "mosquito in your collar"
上面把所有的e全换成了o,语法也是要跟在字符串后面的,而不是那个引用对象。

3、System.out.println(s == value);
这个肯定是false啊。==对于对象相比来说,是比较两个对象在内存中的地址符是否一样。而.equals才是比较字符串内容是否相同。

另外
String s = "abc"
String value = new String ("abc");
这两种新建字符串对象的方式是不一样的,第一种是在建立前先看内存中是否有这个相同内容的字符串,如果有,就是把旧的指向S,如果没有就是新建。而第二个是不管有没有,都要去新建一个内容是abc的String对象。所以两个对象在内存中的地址是不一样的。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1 感谢解答!

查看全部评分

回复 使用道具 举报
subString和replace相当于String的两个方法,调用方法为什么会报错?它只是没有记录返回值而已
打印abc的原因是String是常量,就是你无论调用它的什么方法,对象本身的值是不会改变的,你可以去看看帮助文档
打印false的原因是字符串本身就是一个引用类型好么,String相当于char[],无论怎么看它也不是基础类型啊,
String s = "abc" 相当于 String s = new String("abc").intern();
String value = new String("abc"); 相当于重新开辟了一个内存空间,所以两者的引用不同
还是那句话,去读读String的帮助文档吧
回复 使用道具 举报
零下五度的水 发表于 2013-11-4 10:04
subString和replace相当于String的两个方法,调用方法为什么会报错?它只是没有记录返回值而已
打印abc的原 ...

小弟新手,如何查看帮助文档?
还有
String s="abc"; //按照你的意思是这句话也会在堆内存中开辟空间?
回复 使用道具 举报
本帖最后由 魏-玉-彪 于 2013-11-4 11:55 编辑

  1. public class StringTest {
  2.     public static void main(String[] args) {
  3.             String s = "abc";//把字符串abc赋值给字符串变量s
  4.                //s.substring(1);
  5.   //百度substring,得知该方法返回字符串,所以返回bc,但是这行语句是个表达式,不是完整语句。编译报错。

  6. s=s.substring(1)           // substring()方法返回一个字符串,所以要用变量接收 加上此行试试
  7.               System.out.println(s);
  8.             
  9.            
  10. //s.replace("bc", "xyz");
  11.             //百度replace,得知该方法返回字符串,所以返回xyz,但是这行语句也是个表达式,不是完整语句。编译报错。


  12. s=s.replace("bc", "xyz");           //同理,.replace()方法也是返回一个字符串,所以也要有变量接收

  13.            System.out.println(s); //打印abc,但是执行不到这行语句。
  14. //这里批印xyz而不是abc


  15.            String value = new String ("abc");//建立String型对象 value,往对象内传参数为字符串abc。
  16.            System.out.println(s == value);//编译报错,不同类型。s是字符串"abc",value是引用类型变量
  17. //上面不会报错

  18.     }
  19. }

复制代码
         从截图上看,编译失败是因为你编译的是其它文件,与此代码无关
字符串无论s "abc"还是变量value都是引用数据类型 包括用final修饰的
字符串常量都是一个类型,不存在不同类型的说法
  false 是  (s == value)得出
的值





评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
去度娘 java api帮助文档 然后下载一个
要是第一次使用"abc"; 是会在堆内存中开辟空间的,相当于 String X = new String("abc").intern();  
这个X相当于一个匿名变量,被存储在字符串缓冲池中,
之后执行String s="abc"; 相当于 String s = X;
要是还有String s2="abc"; 相当于 String s2 = X; 所以 s==s2
String value = new String ("abc"); 相当于重新开辟一个堆空间,就跟X一毛钱关系都没有了

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
如果问题已经解决,请及时修改主题为“提问结束”。
修改主题的方法链接
http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
零下五度的水 发表于 2013-11-4 11:51
去度娘 java api帮助文档 然后下载一个
要是第一次使用"abc"; 是会在堆内存中开辟空间的,相当于 String X  ...

。。API文档我看不懂啊。我知道你说的应该是对的。但是这道题我还是没弄明白。。我直接说说我的不明白的点吧。。

1、变量s  是栈内存中的一个存储空间取名为s吧?

2、对象value 是在栈内存中的一个存储空间取名为value,然后(栈内存value)里面存放的是堆内存中的地址吧?

3、按我的理解。System.out.println(value) 输出结果应该是“String@15bdc50 ”,但是真正的输出结果是abc
我更晕了。。
回复 使用道具 举报
输出的本质是调用对象的toString方法,你理解的这个没有重写toString方法的那种输出格式(貌似是Object)继承的那个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马