java的数据类型分为对象类型object type和基本类型primitive typeint,char,float等属于基本类型,赋值的时候是数值复制对象类型,赋值的时候是地址复制
但是String对象类型除外,每次都会new出一个新的String对象,赋值的时候是数值复制

解决方案 »

  1.   

    哦我知道了String和int等他们一样每次赋值时是复制一个数值进行传递,不是传递引用???
      

  2.   

    TO: foxsay() 
    但是String对象类型除外,每次都会new出一个新的String对象,赋值的时候是数值复制
    ------------------------------------------------------------------------------每次都是new新的吗?试试这段代码:
    String str1 = new String("A");//注意这里不是String str1 = "A"; String str2 = str1; if (str1 == str2) {
    System.out.println("same address");
    } else {
    System.out.println("different address");
    }每次new新的是说String是不可变的,而不是不可多引用的
      

  3.   

    你用
    String str1 = "A";
    String str2 = "A";
    结果也是str1 == str2我觉得String str2 = str1并不是地址赋值,是数值复制。String与其他object不同。
      

  4.   

    TO:foxsay() 我不是写了吗String str1 = new String("A");//注意这里不是String str1 = "A";不明白这点可以在csdn搜索一下intern,或者看看javadoc中String的intern方法你那样声明的两个“A”实际上是池中的同一个实例的引用。
      

  5.   

    TIJ里好像写过:
    intern() 为每个独一无二的字符顺序都产生一个(而且只有一个)String句柄 
    一旦有必要改变原来的内容, 每个String方法都小心地返回了一个新的String对象。
    若内容不需要改变, 则方法只返回指向原来那个String的一个句柄。
    这样做可以节省存储空间和系统开销。
      

  6.   

    To binny 
    我赞成这种观点:
    “我觉得String str2 = str1并不是地址赋值,是数值复制“
     我个人理解之所以出现地址看似相同,是因为String class 重载了 == 运算符
      

  7.   

    唉,又看到有人在误导别人了。String与其他object不同。??? 同意此观点的人应该好好修炼修炼面向对象理论哎~~String之所以看起来与其他object不一样只不过是因为它是final的,而且没有提供modify其内容的方法而已,这样的class还有很多,Integer等,它一点也不特殊,是个极其普通的class,java对它的处理与其他object完全一样!
      

  8.   

    TO:foxsay() 你理解那段话的意思了吗?“每个独一无二的字符顺序”指的就是你的“A”由于“内容不需要改变”所以你取得的第二个String“指向原来那个String的一个句柄”其实用String str1 = "A";这样来声明String就和用了intern这个方法一样。所以是指向同一个对象TO:creationbj() 我个人理解之所以出现地址看似相同,是因为String class 重载了 == 运算符--------------------------------------------------------------------------java中只有一个运算符被重载了,但不是 == 而是 + 所以你的理解……
      

  9.   

    TIJ:
    Since String objects are immutable, you can alias to a particular String as many times as you want. Because it’s read-only, there’s no possibility that one reference will change something that will affect the other references. So a read-only object solves the aliasing problem nicely.
    因为String是java中经常使用的类,所以TIJ的作者使用String来说明一些特殊类的特性。他称String为Immutable Strings。就是为了说明String等类与绝大多数object的不同。可能我的用语有时不太确切。
    无论是final,还是String等类,都是java的特性。与面向对象理论并不等同
      

  10.   

    Java编译器自动实现了字符串的 Flyweight模式,所以只要是取值相同的String实例,应该指向同一地址。
      

  11.   

    楼上,你摘出这句话是说明什么意思?是想驳斥你在2楼说的那句“但是String对象类型除外,每次都会new出一个新的String对象,赋值的时候是数值复制”吗?
      

  12.   

    就是想说明,即使多个String实例指向同一个地址,但是改变了其中任何一个的值,并不会影响其他的值。
      

  13.   

    TO:foxsay() :楼主的提问是“什么时候是复制对象,什么时候是复制引用????”你告诉楼主“int,char,float等属于基本类型,赋值的时候是数值复制 。对象类型,赋值的时候是地址复制”“但是String对象类型除外,每次都会new出一个新的String对象,赋值的时候是数值复制”楼主回复“哦我知道了String和int等他们一样每次赋值时是复制一个数值进行传递,不是传递引用???”你说 “zfd(稻草人)的理解正确”说明你告诉楼主“String和int等他们一样”“是数值复制”“不是传递引用”
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    我给你举例子说明String是传递引用,你却引一段关于immutable Strings说“就是想说明,即使多个String实例指向同一个地址,但是改变了其中任何一个的值,并不会影响其他的值”如果“不是传递引用”哪来的“多个String实例指向同一个地址”
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    既然你自己都不清楚自己再说什么,我不再和你讨论了
    TO:zfd (稻草人) 很明显,String 和其他的对象类是一样的,是传递的引用。只是java的引用和C的指针不太一样。这和String、Integer、Long等的immutable(不可变)是两回事。
      

  14.   

    To  binny(骑个破车看夕阳) :
    操作任何object都是使用reference。但是不同object之间有差异。TIJ使用immutable object来区分普通的object。
    【当然这可能只是TIJ的叫法,不过我觉得很形象。】
    immutable object的所有操作都会返回一个同型对象,不会改变原始对象的内容。
    看你这么“形容”上面的话了!!!
    还有,String的重载运算符有+和+=,不是只有+
      

  15.   

    谢谢大家,能给我这么多的答复,我在这再次感谢大家,但是我还是有些糊涂,就是String类了,到底什么时候是传递的复制,什么时候传递是引用???
      

  16.   

    实际上java没有引用,只有传值。 引用也是通过传递地址来实现的。
      

  17.   

    楼上的,既然要解释就要解释清楚呀?否则,看你恢复的人越看越糊涂的。楼上的说法是正确的,对于基本类型没问题,传值;对象传引用,这个引用是什么呢?也就是一个地址的数值。所以有人认为,java就是传值。这其实就是个概念问题,什么叫值,什么叫址。没有值,址用什么来体现。这个争论已经有很多年了,我认为,理解了就行了,不用去争论这些没有意义的东西。TO:zfd(稻草人)但是我还是有些糊涂,就是String类了,到底什么时候是传递的复制,什么时候传递是引用???
    --------------------------------------------------------------------------------
    String是对象