关于java对象克隆的问题
一个关于对象克隆的例子:class Employee implements cloneable
{
public Employee(String n,Date s)
{
name = n;
salary = s;
}
public Employee clone() throws CloneNotSupportException
{
Employee x = (Employee) super.clone();
x.salary = (Date) salary.clone();
return x;
}
}
问题1:既然clone方法是object的一个protected方法,根据子类可以调用超类的protected方法的原则,为何不直接调用,而必须调用cloneable接口,定义其方法的方式进行操作,资料上的解释我确实看不明白。
问题2:public Employee clone() throws CloneNotSupportException,这个clone方法的申明中,为何要将其返回类型定义为Employee类型的?clone方法不是object类吗?
问题3:public Employee clone() throws CloneNotSupportException,还是这句话,为何要提前抛出异常,书中解释说,只要在clone方法中含有没有实现的类的对象,就要抛出异常,但是在程序中,Employee类和Date类已经都实现了啊。百思不解啊!
问题4:Employee x = (Employee) super.clone();这个程序段是java中的强制类型转换吗?我也大概明白super.clone()是调用object类的clone方法,但是在Employee类型中打上括弧有何意义?强制类型转换吗?
问题5:x.salary = (Date) salary.clone();同上!还是一样的问题没理解到其深刻含义。希望各位JAVA江湖的各位高手,各位满意答案,谢谢啦!
追问:关于问题1:已解决,补充一下,你解释的此时此刻的对象属性以及实例域的拷贝应该打着重符号,因为我终于理解到Date为可变子对象,在第一个时刻,你浅拷贝,但是Date对象是及时变化,下一个时刻,你就没有真正拷贝类对象的数据域。谢谢你,我终于理解到这点了,为何要应用cloneable接口。关于问题2:public Employee clone() throws CloneNotSupportException这个是在类实现的接口中,定义子类自己的clone方法,其返回类型为Employee。其实书中不是这样的,而是public Object clone() throws CloneNotSupportException仍然采用超类进行定义。我误打误撞居然改正确了,在这里我再次希望你确认一下。
关于问题3:在类Employee实现接口的方法clone中,有了此类的构造器申明,为
public Employee(String n,Date s),那么问题来了,你说从上面程序段看不出Date类是否实现了cloneable接口,意思是如果实现了,就不会抛出异常,你能否举例,Date类如何实现cloneable接口?
关于问题4:谢谢,我已经理解到你说的了,但是问题又出来了,再看这个句子:Employee x = (Employee) super.clone();我百思不得其解的是super.clone()应该子类调用超类的clone方法吧,然后这个clone方法克隆的是超类的数据域吧,然后呢?再传参给类Employee的引用x。(这里的传参是地址的传递),那么这样一思考下来,我就又糊涂啦,再看这个句子:Employee x = (Employee) super.clone();申明类型为Employee的对象参数x,然后x他作为引用指向超类Object的数据域的拷贝,并进行强制类型转化,这样不对吧?请你再解释一下,谢谢了。
关于问题5:x.salary为何不能写成this.salary。