不是说String不可变吗?

jnetzhou Java面向对象中引用的传递 最后由 jike_ys24bdpj 于05月08日回复

  • 2 回答
  • 881 浏览
为什么内存分析那里str2也指向hello,而不是指向jike呢?
  • libra_lm 2014年07月16日 回答 #1楼
  • 不可变指的是对象长度不可变。

    你说的str2是引用, hello和jike是属于对象。引用是可以指向不同的对象的。

  • 1 评论
  • jike_ys24bdpj 05月08日 回答 #2楼
  • 这里老师说到string不可变,解释上有一点不完全。

    在Java中,String为一个对象,通常在赋值时所用语句为String str=“string”;对String对象赋值。其后台帮助我们做了一件隐藏事为String str=new String();

    你可以对比以下两段代码(老师的第一个例子代码和相似代码片段)

    片段一:(老师源码)

    class Ref1 {

    int temp = 10;

    }

    public class RefDemo01 {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Ref1 r1 = new Ref1();

    r1.temp=20;

    System.out.println(r1.temp);

    tell(r1);

    System.out.println(r1.temp);

    }

    public static void tell(Ref1 r2) {

    r2.temp=30;

    }

    }

    片段二:

    class Ref1 {

    int temp = 10;

    }

    public class RefDemo01 {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Ref1 r1 = new Ref1();

    r1.temp=20;

    System.out.println(r1.temp);

    tell(r1);

    System.out.println(r1.temp);

    }

    public static void tell(Ref1 r2) {

    r2=new Ref1();

    r2.temp=30;

    }

    }

    代码片段二比代码片段一多做了一件事,在r2指向r1所指向的堆内存过后,又重新个自己new了一个新的堆内存后让自己指向新的堆内存空间。

    代码三:(老师的源码)

    public class RefDemo02 {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    String str1="hello";

    System.out.println(str1);

    tell(str1);

    System.out.println(str1);

    }

    public static void tell(String str2) {

    str2="jike";

    }

    }

    str2就如同代码片段而中的r2一样,一共做了两件事情;

    关于老师讲的这三个例子,需要对堆-栈内存之间的关系,以及栈内存中的对象如何准确找到堆内存中的值理解透彻后例子中问题都会迎刃而解。

  • 1 评论