特别注意:
1.此处说到的克隆是指浅克隆
2.在实现Object的clone()前,需要实现Cloneable接口
3.按照惯例,实现此接口的类应该使用公共方法重写Object的clone()方法,Object的clone()方法是一个受保护的方法;
4.为什么要是使用克隆方法:
假设我有类A,我想在不破坏类A源码的情况下对类A进行修改操作,那么这个时候就可用到clone(),
即克隆它自身以及它所包含的所有对象的引用地址
代码如下:
package com.test;
public class Test1 {
public static void main(String[] args) {
try {
Person person = new Person("张三",24,new Address("厦门市","仙岳路"));
Person perclone = (Person) person.clone();
System.out.println("改变前:" + person);
System.out.println("改变前:" + perclone);
boolean flag = (person == perclone )? true : false;
System.out.println("person 与 perclone 是否是同一对象:" + flag);
perclone.setName("李四");
perclone.setAge(23);
perclone.setAddr(new Address("成都市","金牛区"));
System.out.println("改变后:" + person);
System.out.println("改变后:" + perclone);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
/**
* @ClassName: Person
* @Description: TODO(这里用一句话描述这个类的作用)
* @author
* @date 2018年7月31日 下午11:02:08
*/
class Person implements Cloneable{
private int age;
private String name;
private Address addr;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + ", addr=" + addr + "]";
}
public Person(String name,int age,Address addr){
this.age = age;
this.name = name;
this.addr = addr;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddr() {
return addr;
}
public void setAddr(Address addr) {
this.addr = addr;
}
}
/**
* @ClassName: Address
* @Description: TODO(这里用一句话描述这个类的作用)
* @author
* @date 2018年7月31日 下午11:03:33
*/
class Address{
private String province;
private String stree;
@Override
public String toString() {
return "Address [province=" + province + ", stree=" + stree + "]";
}
public Address(String province, String stree) {
super();
this.province = province;
this.stree = stree;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getStree() {
return stree;
}
public void setStree(String stree) {
this.stree = stree;
}
}
最后结果如下: