string类型的 深拷贝问题

我用的是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只是浅克隆,也就是说除非基本类型外,引用类型只是拷贝引用,不会复制对象