黑马程序员技术交流社区

标题: 这段程序的打印为什么是:good and gbc [打印本页]

作者: mf152    时间: 2013-9-18 17:22
标题: 这段程序的打印为什么是:good and gbc
本帖最后由 杨增坤 于 2013-9-22 21:01 编辑

这段程序的打印为什么是:good and gbc  是怎么推的?
    public class Example{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);
  }
  public void change(String str,char ch[]){
    str="test ok";
    ch[0]='g';
  }
}


作者: Cway㊣    时间: 2013-9-18 17:43
通过new String()与str="test ok"是2个不一样的内存块,所以,你在change()函数中只是重新在内存中开辟了一块临时内存存放“test ok”,并未改变str=new String()《这个是存在与堆内存中的》中str的值,而ch不同,你通过ch[0]改变的实际就是在Example类中创建的那个ch,string是一个特殊的对象
作者: Cway㊣    时间: 2013-9-18 17:51
public class Example{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);
  }
  public void change(String str,char ch[]){
    str="test ok"; //实际上重新在栈内存中开辟了一片内存  值为“test ok”并将他赋给str,这里的str与上面的new String()的对象引用变量的str是不一样的    
        ch[0]='g'; //这里的ch与上面的ch都是指向同一堆内存地址
  }
}
作者: 坚持。    时间: 2013-9-18 23:10
public class Example{
  String str=new String("good");
  char[]ch={'a','b','c'};
  public static void main(String args[]){
    Example ex=new Example();
    ex.change(ex.str,ex.ch);
    System.out.print(ex.str+" and ");
    Sytem.out.print(ex.ch);
  }
  public void change(String str,char ch[]){
    str="test ok";  
         ch[0]='g';
  }
}

对象 数组  都是在堆内存中,变量 是在栈内存中,   String str=new String("good");
  char[]ch={'a','b','c'}; 这两个都保留在了堆内存中, str="test ok";  保存在栈内存中,当花括号结束就释放内存。      ch[0]='g'; 保存在堆内存中,他把 char[]ch={'a','b','c'};地址为0的第一号元素‘a’给替换了,变成了ch={'g','b','c'}。    记住:栈内存是在方法花括号结束释放内存,堆内存随着内的加载完毕花括号才释放内存。   现在理解了吗?
作者: mf152    时间: 2013-9-19 14:12
恩  谢谢
作者: 简单ai...    时间: 2013-9-21 18:33

    分析如下见注释:不知道有没有问题,
  1. public class Example{
  2.   String str=new String("good");
  3.   char[]ch={'a','b','c'};
  4.   public static void main(String args[]){
  5.     Example ex=new Example();
  6.     ex.change(ex.str,ex.ch);
  7.     System.out.print(ex.str+" and ");
  8.     Sytem.out.print(ex.ch);
  9.   }
  10.   public void change(String str,char ch[]){
  11.     str="test ok"; //这里改变了str的数据,让str指向“test ok ”的地址,但没有改变str原有数据
  12.     ch[0]='g'; //这里改名零号位的数据为g.
  13.   }
  14. }
复制代码

作者: 流浪的风    时间: 2013-9-21 21:43
字符串一旦被创建就不能被改变,你在下面的代码是重新创建了一个字符串对象,所以原来的字符串根本没有改变!




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