1.实在没兴趣再研究这个了2。clone()方法返回的是对象的值克隆,也就说不是对象的引用
但是这个类必须实现Cloneable接口,然后重写Ibject类的clone()方法
在这个方法里面我们把值传个接受的对象。如果类里面还有其他类的对象,这就涉及深克隆和浅克隆的问题了
如果仅仅克隆本身类而没有再克隆类里面其他对象,这就浅克隆,也就说他克隆之后里面嵌套的对象还是引用。
深克隆就是递归地克隆类里面嵌套的对象,使得克隆大对象的时候保证里面的小对象也是克隆值!
但是这个类必须实现Cloneable接口,然后重写Ibject类的clone()方法
在这个方法里面我们把值传个接受的对象。如果类里面还有其他类的对象,这就涉及深克隆和浅克隆的问题了
如果仅仅克隆本身类而没有再克隆类里面其他对象,这就浅克隆,也就说他克隆之后里面嵌套的对象还是引用。
深克隆就是递归地克隆类里面嵌套的对象,使得克隆大对象的时候保证里面的小对象也是克隆值!
学习ing
楼上得好像分析得很透彻
受益匪浅
谢谢
谢谢楼主得问题
创建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的引用
http://search.csdn.net/Expert/topic/948/948323.xml?temp=.7734644(提问的智慧)
楼主有空可以去看看
csdn上很正常啦做人快乐之本--帮助他(她)人
也就是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 应该是引用。
字符串创建 String aa="a";在栈里创建具体创建没有还要看上下文,因为栈里的数据是可以共享的。
String aa=new String("aa")肯定创建了对象不过是在堆里。楼上的
//修改:
s2 = "def";
//结果:
s4 == "def" //???按照你的意思??? //不可能吧。这句本来就是又创建了一个对象
s4 == "def" 这是一个比较判断语句啊?怎么会创建新的对象呢?
----------------------------------------------
//修改:
//定义:
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)
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;我这样理解对么?
而==是比较同一对象是否在同一内存地址
"还有是此时判断 if( s2 == s4 ) 是会返回 false的,因为s2, s4这两个reference的地址不同
"这句话是针对“令s2 = "def";此时又有一个"def"的String(这个String有一个地址B),此时s2 reference中存的是地址B,而s4中存的是地址A”说的嘛,呵呵,标点没点好
String s4 = "abc";也就是说:s2 和 s4 指向同一个地址?
(我想确认一下;如果是,我就清楚了。)
我觉的是的:)
String s2 = "abc";的结果是 s1 和 s2 指向同块内存区域;