黑马程序员技术交流社区

标题: 一个小程序的结果 求解 [打印本页]

作者: 曾浩    时间: 2012-10-2 17:44
标题: 一个小程序的结果 求解
本帖最后由 曾浩 于 2012-10-2 22:58 编辑

public class Example{
  String str=new String("good");
  StringBuffer sb = new StringBuffer("ikla");
    char[]ch={'a','b','c'};
   public static void main(String args[]){

    Example ex = new Example();
    ex.change(ex.str, ex.ch,ex.sb);
    System.out.print(ex.str+"and");
    System.out.print(ex.ch);
    System.out.println(ex.sb);
    }
public static void change(String str,char ch[],StringBuffer sb){
     
str = "testok";
ch[0]='g';
sb.append("bian") ;
}
}
请问输出结果为什么是goodandgbciklabian       为什么char[] 和StringBuffer 中的数据改变了 而String 类型的对象str 的值没有改变  

作者: 古银平    时间: 2012-10-2 17:54
StringBuffer是字符串缓冲区。

是一个容器。
特点:
1,长度是可变化的。
2,可以字节操作多个数据类型。
3,最终会通过toString方法变成字符串
因为StringBffer是容器,就和一个盆子里面放着面一样,你往里边加点水,在加大枣,但盆子还是那个盆子,里边的东西多了而已,你把大枣取出来,还是那个盆子。
String不一样,一旦String str=new String("good");将在会在数据池中建立good,str指向good,改变只是str指向另一个数据了。
作者: 王中利    时间: 2012-10-2 18:00
String类只要一声明,就不能在变化了,而StringBuffer可以完成字符串的动态添加,插入和替换等操作。
作者: 武庆东    时间: 2012-10-2 18:10

请问输出结果为什么是goodandgbciklabian       为什么char[] 和StringBuffer 中的数据改变了 而String 类型的对象str 的值没有改变  
因为:String是fina类型一旦定义无法修改。api解释:
public final class String  extends Objectimplements Serializable, Comparable<String>, CharSequenceString 类代表字符串。
Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。
作者: 曾浩    时间: 2012-10-2 18:27
武庆东 发表于 2012-10-2 18:10
请问输出结果为什么是goodandgbciklabian       为什么char[] 和StringBuffer 中的数据改变了 而String 类 ...

那change方法中的str=“testok”    这一句是重新定义的一个字符串吗?
作者: 武庆东    时间: 2012-10-2 19:11
曾浩 发表于 2012-10-2 18:27
那change方法中的str=“testok”    这一句是重新定义的一个字符串吗?

我认为是重新定义的一个字符串
作者: 黑马-王燚    时间: 2012-10-3 00:07
其实很好理解啊 ,  change方法里面的 str 是局部变量了,方法结束 自己就没了,我画图解释给你看下
(此图画的是原理,里面的具体值可能跟你的有点不一样,不过这个应该不是问题吧)

首先要明确:str   sb   ch 作为参数传进来的时候  刚开始都是指向原有的地址值   ,而且这3个在change方法里面都属于局部变量了

1.str传进来后,指向地址值发生了变化,指向了上图所说的Ox124 ,但是  之前的Ox123里面的内容没有发生变化啊,  str这个局部变量在局部方法change结束之后就消失了,
main函数中的ex.str还是指向0x123呗(内容又没发生改变,打印出来的值 自然还是good了)
2.而  ch  字符数组 传进来  改变了 原有的数组, 将char[0]   零下标的值改成了g   ,局部方法执行完后,就到了main方法里面,ex.ch打印的值自然就改成了gbc了
3.sb  字符缓冲区 的操作原理跟 char[]类似,  你append()了之后  会将原有的 StringBuffer内容扩增,  局部方法执行完后,就到了main方法里面ex.sb自然就是 改变后的值了

作者: 邓艳秋    时间: 2012-10-3 01:15
string类型的变量一旦声明赋值就不可改变。
作者: 李玉生    时间: 2012-10-3 08:47
顶一下,分析的很好




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