1.实在没兴趣再研究这个了2。clone()方法返回的是对象的值克隆,也就说不是对象的引用
但是这个类必须实现Cloneable接口,然后重写Ibject类的clone()方法
在这个方法里面我们把值传个接受的对象。如果类里面还有其他类的对象,这就涉及深克隆和浅克隆的问题了
如果仅仅克隆本身类而没有再克隆类里面其他对象,这就浅克隆,也就说他克隆之后里面嵌套的对象还是引用。
深克隆就是递归地克隆类里面嵌套的对象,使得克隆大对象的时候保证里面的小对象也是克隆值!

解决方案 »

  1.   

    路过
    学习ing
    楼上得好像分析得很透彻
    受益匪浅
    谢谢
    谢谢楼主得问题
      

  2.   

    (1)我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,我们创建了String类的对象str。担心陷阱!对象可能并没有被创建!唯一可以肯定的是,指向String类的引用被创建了。至于这个引用到底是否指向了一个新的对象,必须根据上下文来考虑,除非你通过new()方法来显要地创建一个新的对象。因此,更为准确的说法是,我们创建了一个指向String类的对象的引用变量str,这个对象引用变量指向了某个值为"abc"的String类。清醒地认识到这一点对排除程序中难以发现的bug是很有帮助的。  (2)使用String str = "abc";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。这个思想应该是享元模式的思想,但JDK的内部在这里实现是否应用了这个模式,不得而知。
      

  3.   

    s1和s3的对象分别独立使用new String创建,所以指向是不同的
    创建s1的时候先在string池中生成一个abc(如池里已有则直接引用),并以此来构造一个新的string
    s3创建同样使用池里的abc来构造另一个新的string
    s2是对string池中的abc进行引用
    也就是s1,s2,s3分别为3个不同的对象
    如果再有s4="abc",则可以得知s4是对string池的引用,并且abc已经存在于string池,那么
    s2和s4就应该是对同一个对象的引用
    所以new出来的string各自独立,直接创建的都是对池内string的引用
      

  4.   

    http://search.csdn.net/Expert/topic/1437/1437953.xml?temp=.7517359(提问的技巧)
    http://search.csdn.net/Expert/topic/948/948323.xml?temp=.7734644(提问的智慧)
    楼主有空可以去看看
      

  5.   

    007remember(绿原):谢了,去的途中........
      

  6.   

    您太客气啦
    csdn上很正常啦做人快乐之本--帮助他(她)人
      

  7.   

    s2是对string池中的abc进行引用
    也就是s1,s2,s3分别为3个不同的对象
    如果再有s4="abc",则可以得知s4是对string池的引用,并且abc已经存在于string池,那么
    s2和s4就应该是对同一个对象的引用
    -------------------------------------------------    ????????s2和s4就应该是对同一个对象的引用 ??? 
    不是吧。
    //定义:
    String s2 = "abc";
    String s4 = "abc";
    //修改:
    s2 = "def";
    //结果:
    s4 == "def" //???按照你的意思???  //不可能吧。我感觉
    s2和s4应该是String 类是实体;不是什么引用。否则s2==s4 怎么为真呢?
    s1 和 s3 应该是引用。
      

  8.   

    对于第一个问题网上已经讨论很多了
    字符串创建 String aa="a";在栈里创建具体创建没有还要看上下文,因为栈里的数据是可以共享的。
               String aa=new String("aa")肯定创建了对象不过是在堆里。楼上的
    //修改:
    s2 = "def";
    //结果:
    s4 == "def" //???按照你的意思???  //不可能吧。这句本来就是又创建了一个对象
      

  9.   

    去看《CORE JAVA2 卷1》第六版吧,包你有个满意的答案
      

  10.   

    不理解。
    s4 == "def" 这是一个比较判断语句啊?怎么会创建新的对象呢?
      

  11.   

    总算明白 FBug(花知)
    ----------------------------------------------
    //修改:
    //定义:
    String s2 = "abc";
    String s4 = "abc";
    //修改:
    s2 = "def";
    //结果:
    s4 == "def" //???按照你的意思???  //不可能吧
    ----------------------------------------------
    的意思了,FBug(花知)你的理解有问题的,//定义:String s2 = "abc";String s4 = "abc";后s2, s4都是reference(就相当于C中的指针一样),在内存中有一个"abc"的String(这个String有一个地址A),那么s2, s4中存的是这个地址A, 还有是此时判断 if( s2 == s4 ) 是会返回 false的,因为s2, s4这两个reference的地址不同令s2 = "def";此时又有一个"def"的String(这个String有一个地址B),此时s2 reference中存的是地址B,而s4中存的是地址A不过在java里其实不管什么reference的,但是对这个理解一下的话也有些帮助.Java里面的任何对象的定义:
    String a ; 或者自已的类Myclass my;都是reference,不过这些reference都指向一个object(可以看看Effective java)
      

  12.   

    to: eureka0891----------------------------
    String s2 = "abc";
    String s4 = "abc";if(s2==s4)
       print("true");
    else
       print("false");
    ------------------------------  执行上面的代码后打印出的是true哦。我可能已经理解你的意思了。只是上面的返回结果可能你写错了。
    是不是这样的:
    String s2 = "abc";后,"abc"存在内存的的地址A上;
    String s4 = "abc";后,发现内存中已有"abc"在地址A上。于是就把A地址赋值给s4;
                      这时,s2 和 s4 都是指向地址A中的字符串"abc";
    s2 = "def";的结果是重新去分配一地址B来存储字符串"def";并把地址B赋值给s2;我这样理解对么?
      

  13.   

    equals是比较表达式的内容
    而==是比较同一对象是否在同一内存地址
      

  14.   

    FBug(花知): (eureka0891)的
    "还有是此时判断 if( s2 == s4 ) 是会返回 false的,因为s2, s4这两个reference的地址不同
    "这句话是针对“令s2 = "def";此时又有一个"def"的String(这个String有一个地址B),此时s2 reference中存的是地址B,而s4中存的是地址A”说的嘛,呵呵,标点没点好
      

  15.   

    String s2 = "abc";
    String s4 = "abc";也就是说:s2 和 s4 指向同一个地址?
    (我想确认一下;如果是,我就清楚了。)
      

  16.   

    to FBug(花知):
    我觉的是的:)
      

  17.   

    今天去书店看了。对的。String s1 = "abc";
    String s2 = "abc";的结果是 s1 和 s2 指向同块内存区域;