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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾浩 中级黑马   /  2012-10-2 17:44  /  1845 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曾浩 于 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 的值没有改变  

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

8 个回复

正序浏览
顶一下,分析的很好
回复 使用道具 举报
string类型的变量一旦声明赋值就不可改变。
回复 使用道具 举报
其实很好理解啊 ,  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-2 18:27
那change方法中的str=“testok”    这一句是重新定义的一个字符串吗?

我认为是重新定义的一个字符串
回复 使用道具 举报
武庆东 发表于 2012-10-2 18:10
请问输出结果为什么是goodandgbciklabian       为什么char[] 和StringBuffer 中的数据改变了 而String 类 ...

那change方法中的str=“testok”    这一句是重新定义的一个字符串吗?
回复 使用道具 举报

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

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
String类只要一声明,就不能在变化了,而StringBuffer可以完成字符串的动态添加,插入和替换等操作。
回复 使用道具 举报
StringBuffer是字符串缓冲区。

是一个容器。
特点:
1,长度是可变化的。
2,可以字节操作多个数据类型。
3,最终会通过toString方法变成字符串
因为StringBffer是容器,就和一个盆子里面放着面一样,你往里边加点水,在加大枣,但盆子还是那个盆子,里边的东西多了而已,你把大枣取出来,还是那个盆子。
String不一样,一旦String str=new String("good");将在会在数据池中建立good,str指向good,改变只是str指向另一个数据了。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马