黑马程序员技术交流社区

标题: 请教一下!!! [打印本页]

作者: ShadowDancer    时间: 2015-2-26 20:20
标题: 请教一下!!!
  1. class  Test{
  2.         public static void main(String[] args) {
  3.                 String s1 = "java";
  4.                 String s2 = "hello";
  5.                 method_1(s1,s2);
  6.                 System.out.println(s1+"...."+s2); //java....hello
  7.                
  8.                 StringBuilder s11 = new StringBuilder("java");
  9.                 StringBuilder s22 = new StringBuilder("hello");
  10.                 method_2(s11,s22);
  11.                 System.out.println(s11+"-----"+s22); //javahello-----hello
  12.         }
  13.         public static void method_1(String s1,String s2){
  14.                 s1.replace('a','k');
  15.                 s1 = s2;
  16.         }
  17.         public static void method_2(StringBuilder s1,StringBuilder s2){
  18.                 s1.append(s2);
  19.                 s1 = s2;
  20.         }
  21. }
复制代码


作者: ShadowDancer    时间: 2015-2-26 20:23
为什么打印结果是代码中注释的那样子的呢???
作者: lang    时间: 2015-2-27 20:41
?????
对啊,s1=s2,只在函数里有效
而将语句s1=s2放在类中,却有效

作者: ShadowDancer    时间: 2015-2-28 08:06
lang 发表于 2015-2-27 20:41
?????
对啊,s1=s2,只在函数里有效
而将语句s1=s2放在类中,却有效

你来问我啊 哥哥
作者: 新生小周    时间: 2015-2-28 12:01
1、method_1(String s1,String s2)中虽然使用了s1.replace('a','k');但是返回的替换字符串没有进行存储操作,所以s1仍然是没有替换的状态-->java。验证方法1、System.out.println(s1);System.out.println(s1.replace('a','k'));验证方法2、s1=s1.replace('a','k');System.out.println(s1);
2、method_2(StringBuilder s1,StringBuilder s2)中s1.append();方法不同于s1.replace()方法,它会自动存入s1中,验证可以打印s1-->javahello; 在调试method_2函数时我也犯了一下迷糊,列出几种假设,均被一一推翻,直接dubug调试。恍然大悟。
总结:其实两个函数出现问题均相同,理清关系的问题,请看代码分析和图片分析[code]package t;

class  te{
    public static void main(String[] args) {
            String s1 = "java";
            String s2 = "hello";
            method_1(s1,s2);
            System.out.println(s1+"...."+s2); //java....hello
            
            StringBuilder s11 = new StringBuilder("java");
            StringBuilder s22 = new StringBuilder("hello");
            method_2(s11,s22);
            System.out.println(s11+"-----"+s22); //javahello-----hello
    }
    public static void method_1(String s1,String s2){
            s1.replace('a','k');
            

a.png (62.12 KB, 下载次数: 50)

关系描述

关系描述

作者: 菠菜树    时间: 2015-2-28 12:31
新生小周 发表于 2015-2-28 12:01
1、method_1(String s1,String s2)中虽然使用了s1.replace('a','k');但是返回的替换字符串没有进行存储操作 ...

那s1=s2这个是怎么回事?
作者: lang    时间: 2015-2-28 14:51
我明白了,s1=s2的问题了,等下,我组织一下语言
作者: lang    时间: 2015-2-28 15:07
我改一下变量名,便于区分
public static void main(String[] args) {
                String s1 = "java";
                String s2 = "hello";
                method(s1,s2);
                System.out.println(s1+"...."+s2); //java....hello
        }
        public static void method(String t1,String t2){
                t1 = t2;
                                System.out.println(t1+"...."+t2);//hello....hello
        }
这个的打印结果为注释部分
原因:因为 String 对象是不可变的
传入method方法里的并不是变量s1、s2,而是String对象"java"、"hello"的地址值,虽然内容相同,但性质不同。
在method方法中,t1指向"java",t2指向"hello",也就是说在主函数里s1、ti同时指向"java",s2、t2同时指向"hello",但t1、t2对s1、s2没影响,所以当t1=t2时,改变的只是t1的指向,s1的值不变,任指向"java"。
作者: lang    时间: 2015-2-28 15:10
ShadowDancer 发表于 2015-2-28 08:06
你来问我啊 哥哥

这下问题解决没?
作者: ShadowDancer    时间: 2015-2-28 15:52
lang 发表于 2015-2-28 15:10
这下问题解决没?

其实昨天刚发完帖子  我就自己查API搞明白了。。。




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