JAVA对象clone方法代码实例解析
什么是clone方法
在Java中,Object类的clone()方法用于创建并返回当前对象的一个复制。对象复制即将一个对象的值赋给另一个对象,新对象与原有对象相互独立,新对象修改不会对原有对象造成影响。
clone方法的使用
通过clone方法复制对象,需要满足以下两个条件:
- 实现Cloneable接口。
- 重写Object类的clone()方法。
当需要复制一个对象时,必须先将该对象的类实现Cloneable接口,否则在调用clone()方法时会抛出CloneNotSupportedException异常。
接下来,重写Object类的clone()方法。Object类中clone()方法的修饰符为protected,子类可以继承该方法,但是需要重写其方法体。因为Object类的clone()方法是浅复制的,即将对象的引用复制一份。若该对象是一个可变的类,复制出来的对象与原有对象共享引用,修改一个对象会影响到另一个对象。
clone方法代码实例
下面是一个实现clone方法的Java类:
public class Person implements Cloneable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 重写clone()方法
@Override
public Object clone() {
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
// getter和setter方法
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
在上述代码中,实现了Person类,并且实现了Cloneable接口并重写了clone()方法。接下来,可以使用clone()方法复制Person对象,并对对象进行修改,以证明两个对象互相独立。示例代码如下:
public static void main(String[] args) {
Person person1 = new Person("Tom", 20);
Person person2 = (Person) person1.clone();
System.out.println("person1 == person2:" + (person1 == person2));
System.out.println("person1.getName() == person2.getName():" + (person1.getName() == person2.getName()));
System.out.println("person1.getAge() == person2.getAge():" + (person1.getAge() == person2.getAge()));
person2.setName("Ken");
person2.setAge(23);
System.out.println("person1 :" + person1.getName() + " " + person1.getAge());
System.out.println("person2 :" + person2.getName() + " " + person2.getAge());
}
输出结果为:
person1 == person2:false
person1.getName() == person2.getName():true
person1.getAge() == person2.getAge():true
person1 :Tom 20
person2 :Ken 23
从输出结果可以看出,虽然person1和person2不是同一个对象,但是person1的name和age的引用与person2相同。但是修改person2的name和age后,并不会影响person1中的值。
接下来,再来演示一下没有实现Cloneable接口的类无法使用clone()方法的实例:
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
// 未实现Cloneable接口
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
在上述代码中,实现了Animal类,并且重写了clone()方法。但是,由于没有实现Cloneable接口,所以当使用clone()方法复制对象时,会抛出CloneNotSupportedException异常。下面演示代码:
public static void main(String[] args) {
Animal animal1 = new Animal("Tom");
// 未实现Cloneable接口,会抛出CloneNotSupportedException异常
Animal animal2 = (Animal) animal1.clone();
}
输出结果为:
java.lang.CloneNotSupportedException
at Animal.clone(Animal.java:11)
at Test.main(Test.java:10)
从错误提示可以看出,因为Animal类没有实现Cloneable接口,所以会抛出CloneNotSupportedException异常。
总结
Java中的clone()方法是用于复制对象的方法,需要先实现Cloneable接口并重写Object类的clone()方法。使用clone()方法复制出来的对象与原有对象相互独立,修改一个对象不会影响到另一个对象。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA对象clone方法代码实例解析 - Python技术站