我个人的理解是:不会
JAVA虽然实现上是C的指针和引用
但是既然从语法上摈弃了指针和引用,那么至少在基础的地方应该让你不会感觉到这种东西的存在。也就是说String name = p.name很可能使用了C的拷贝函数做了深度拷贝

解决方案 »

  1.   

    楼主看这里,写得很透彻
    http://www.javaeye.com/topic/12961
      

  2.   

    没有。
    name = name+"abc"; 只是改变了指针指向的内存而已,原来指向的内存的内容并没有变化。
      

  3.   

    这样p.name的值没有改变;
    String name = p.name ;//是将p对象中的属性name在内存中的空间地址引用给了name这个变量
    name = name + "abc";//name所指向的p.name的地址空间的值加上"abc"指向的栈内存中的值,得到一个新的栈内存中值,也就是系统开辟了一个新的空间存储计算的这个值,然后将新的值的地址空间引用给了name变量,所以程序结果:name指向了新值,而p.name还是指向原来的空间值.
      

  4.   


    对的,你要知道,String虽然是传引用,但是Java的String是不变的,所会说
    你一旦
    String s = p.name + "abc",就得形成一个新的String,然后s指向这个新的String,以前的p.name还在那里,但是你如果用StringBuffer这样可变的对象代替String就会变化了
      

  5.   

    不会变,内存上是重新开辟了空间让name去指向他
      

  6.   

    这么说 String 是个特例是不?
      

  7.   

    是个特例,因为String是被定义为final的
      

  8.   

    String 和 StringBuffer都是final型的类,都是不可继承的;
    String 和 StringBuffer实际上都是操作char数组的,String类中定义的char数组是final型的,而StringBuffer中定义的char数组不是final型的,所以String中的值一旦赋值之后是不能修改的,而StringBuffer可以多次修改值。