先上代码:
public class Person implements Cloneable{
private String name;
private int gender;

public Person(String name, int gender) {
this.name = name;
this.gender = gender;
}

public String toString(){
String s = this.name+"   "+this.gender;
return s;
}


public Person clone() throws CloneNotSupportedException{
return (Person)super.clone();
}

static class TestMain{
public static void main(String[] args) throws CloneNotSupportedException{
Person p1 = new Person("zs",0);
Person p2 = p1.clone();
System.out.println(p2);
}
}
}输出:
zs   0
我的问题是:
public Person clone() 中 调用的super.clone(),super应该指代的是父类引用,而Person的父类应当是 Object类型  也就是说我调用的是Object 的clone的方法,但是这样的方法怎么能返回一个子类的类型,更何况 子类的Field还是private类型。
是super类型除了指代父类引用 还是其他的含义,还是java中一些其他的特殊的机制
Java对象

解决方案 »

  1.   

    看到你这个帖子后我马上查看了Object.clone()源代码,如下:
    protected native Object clone() throws CloneNotSupportedException;
    说明这是一个本地方法,所以java语言带来的限制,或许它可以突破第二、父类的方法并非不可以访问子类的字段与方法,当你调用super.clone()的时候,是把当前这个对象作为this传给父类的,java的类型是动态绑定的,所以传给父类的this并没有变成Object类实例,它仍然是Person类实例,所以父类的clone()函数接收到的this并没有被“阉割”成Object第三、java的private之类的访问控制符,只是对正常的程序流程有用。但别忘了反射,通过反射你是可以控制类的结构的,你也可以在运行时通过反射把private变成public。
    并且java还有一个重要的东西,那就是序列化,它可以直接无视一切。通过序列化然后反序列化,你可以克隆一个对象