我用的是jre 1.6 运行的
package Pack;
public class test implements Cloneable {
private String name;
private int age;
test(String name, int age) {
this.name = name;
this.age = age;
}
public Object clone() {
test o = null;
try {
// Object中的clone()识别出你要复制的是哪一个对象。
o = (test) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
public static void main(String[] args) {
test s1 = new test("zhangsan", 18);
test s2 = (test) s1.clone();
s2.name = "lisi";
s2.age = 20;
//修改学生2后,不影响学生1的值。
System.out.println("name=" + s1.name.hashCode()+ "," + "age=" + s1.age);
System.out.println("name=" + s2.name.hashCode() + "," + "age=" + s2.age);
}
}
结果是:
name=-1432604556,age=18
name=3322003,age=20
那么你的问题是什么呢?
test s2 = (test) s1.clone();
换成
test s2 = (test) s1;
则结果是
name=3322003,age=20
name=3322003,age=20
clone会创建一个新的test对象,复制name和age字段,虽然name是String,但是当你
s2.name = "lisi";
这会让另一个对象(s2)的name指向lisi,所以不会影响到s1
我这里也是这个结果。
class Untitled {
public static void main(String[] args) {
test s1 = new test("zhangsan", 18);
test s2 = (test) s1.clone();
s2.name = "lisi";
s2.age = 20;
//修改学生2后,不影响学生1的值。
System.out.println("name=" + s1.name.hashCode()+ "," + "age=" + s1.age);
System.out.println("name=" + s2.name.hashCode() + "," + "age=" + s2.age);
}
}
class test implements Cloneable {
public String name;
public int age;
public test(String name, int age) {
this.name = name;
this.age = age;
}
public Object clone() {
test o = null;
try {
// Object中的clone()识别出你要复制的是哪一个对象。
o = (test) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.toString());
}
return o;
}
}
name=-1432604556,age=18
name=3322003,age=20
你贴的这段代码是浅复制。关于你的问题 caozhy这个哥们已经解释差不多。
我再简单深入明确的解释一下。
一个Java对象在内存中分为3块区域:
对象头(保存对象的哈希码、锁状态等信息)、
实例数据(保存对象属性的值或引用)、
对齐填充(这块区域没有实际意义)。
clone()是Object类中的native方法。调用clone()时会先开辟一块空间,然后生成对象头信息,之后再把被clone的对象的实例数据复制到这块新的空间中。
在这个问题当中你可以把clone()类比以下代码。
Test t0 = new Test("zhangsan",18);
protected Object clone(){
Test test = new Test();
test.name = t0.name;
test.age = t0.age;
return test;
}
这样理解就好。
你的问题是?
clonse只是浅克隆,也就是说除非基本类型外,引用类型只是拷贝引用,不会复制对象