![](https://csdnimg.cn/release/download_crawler_static/9227901/bg6.jpg)
/** 根据现有对象克隆一个新对象,新对象和现有对象的值一样*/
public Object clone() {
try {
// 克隆一个对象时,应该先调用父类的 clone 方法。
ComplexNumber newObject = (ComplexNumber) super.clone();
// 将现有对象的值赋给新对象
newObject.setRealPart(this.realPart);
newObject.setImaginaryPart(this.imaginaryPart);
return newObject;
} catch (CloneNotSupportedException e) {
// 如果没有实现 Cloneable 接口,抛出异常
e.printStackTrace();
return null;
}
}
public static void main(String[] args) throws CloneNotSupportedException {
ComplexNumber a = new ComplexNumber(2, 4);
ComplexNumber b = new ComplexNumber(2, 4);
System.out.println("ComplexNumber a: " + a.toString());
System.out.println("ComplexNumber b: " + b.toString());
// 用自定义的 equals 方法比较两个对象是否相等
System.out.println("a.euqals(b) = " + a.equals(b));
// 用自定义的 hashCode 方法获取对象的 hashCode,
System.out.println("a.hashCode = " + a.hashCode()
+ "; b.hashCode = " + b.hashCode());
// 用自定义的 clone 方法克隆对象
System.out.println("a.clone = " + a.clone().toString());
}
}
运行该程序时的输出如下:
ComplexNumber a: 2.0 + 4.0i
ComplexNumber b: 2.0 + 4.0i
a.euqals(b) = true
a.hashCode = -1126202060; b.hashCode = -1126202060
a.clone = 2.0 + 4.0i
从运行结果可以看出,现在的 equals、hashCode 方法得到的结果更加符合人们的思维,
而 clone 方法也能够克隆出一个和现有对象完全相等的新对象。
(1)实现 equals 方法时,首先要判断传入对象和现有对象是否属于同一类,不同类的
两个对象进行 equals 时返回的结果是 false,如果属于同一类,一一比较对象的每个属性,
如果所有属性都相等,就可以认为这两个对象是相等的,返回 true。
(2)实现 hashCode 方法的思路是:先找到一个能够代表对象的键,跟数据库中数据表
的主键一样(一个主键对应数据表中的一条记录)。如果这个键是 int 类型,就可以直接返
回键做为该对象的 hashCode,如果是其他类型,就用键的 hashCode 做为对象的 hashCode。
(3)如果要使自定义的类能够被 clone,必须实现 Cloneable 接口并且重写它的 clone
方法。如果仅仅重写了 clone 方法而没有在类的声明中添加实现 Cloneable 接口,那么在调
用 clone 方法时将会出现 CloneNotSupportedException 异常。实现 clone 方法时,先调用父类
的 clone 方法,再将现有对象的属性值赋给新的对象。