先贴程序importjava.util.*;publicclassCloneTest{publicstaticvoidmain(String[]args){try{Employeeoriginal=newEmployee("JohnQ.Public",50000);original.setHireDay(2000,1,1);Emp...
先贴程序
import java.util.*;
public class CloneTest
{
public static void main(String[] args)
{
try
{
Employee original = new Employee("John Q. Public", 50000);
original.setHireDay(2000, 1, 1);
Employee copy = original.clone();
copy.raiseSalary(10);
copy.setHireDay(2002, 12, 31);
System.out.println("original=" + original);
System.out.println("copy=" + copy);
}
catch (CloneNotSupportedException e)
{
e.printStackTrace();
}
}
}
class Employee implements Cloneable
{
public Employee(String n, double s)
{
name = n;
salary = s;
}
public Employee clone() throws CloneNotSupportedException
{
// call Object.clone()
Employee cloned = (Employee)super.clone();
// clone mutable fields
cloned.hireDay = (Date)hireDay.clone();
return cloned;
}
/**
Set the hire day to a given date
@param year the year of the hire day
@param month the month of the hire day
@param day the day of the hire day
*/
public void setHireDay(int year, int month, int day)
{
hireDay = new GregorianCalendar(year, month - 1, day).getTime();
}
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}
public String toString()
{
return "Employee[name=" + name
+ ",salary=" + salary
+ ",hireDay=" + hireDay
+ "]";
}
private String name;
private double salary;
private Date hireDay;
}
问题如下:
1.clone方法是否必须重写实现接口?
2.public Employee clone() throws CloneNotSupportedException
{
// call Object.clone()
Employee cloned = (Employee)super.clone();
// clone mutable fields
cloned.hireDay = (Date)hireDay.clone();
return cloned;
}
这是例子中的深克隆方法,书上说只有深克隆才能使克隆的引用类型指向不同的对象,程序运行结果的两个hireDay确实不一样。但是我把上面的方法改成:
public Employee clone() throws CloneNotSupportedException
{
return (Employee)super.clone();
}
这是一个浅克隆(如果这不是浅克隆请告诉我浅克隆怎么定义),然而程序的结果和前面的一样,就是说浅克隆也能使引用类型指向不同的对象?
3.把重写的克隆方法中的cloned.hireDay = (Date)hireDay.clone();注释起来,不改变运行结果。然而书上强调深克隆一定要克隆所有的可变实例域,请解释这个语句的作用。
PS.基于JDK1.5
fangliangliang你的克隆方法return语句应为return cloned;这才是深克隆。改完之后结果是false。
另外第三个问题你自己试下不就知道了。
展开