Clone方法:
示例:
Dog d1=new Dog();Dog d2=d1;此时赋值表示值传递。此时并不是将d1的值赋值于d2,而是将和d1共享一个地址。换句话说如果更改d2的值,则d1的值也会跟着做相应的改变。内存分配图如下。
Object类的clone()方法创建并返回此对象的一个副本,是复制而非共享。克隆的过程是:在堆中新开辟一个空间,把原对象堆内存中的一切复制过来
克隆方法分为“浅克隆”和“深克隆”
- 浅克隆:当类中只有基本数据类型(含String)的属性时可以使用浅克隆,Object类的clone方法已经实现了浅克隆。
实现步骤:
- 实现Cloneable接口;
- 重写Object的clone()方法;
- 在Main方法中,进行克隆调用clone方法。
示例:分析:先定义以一个Person类,设置相应的属性和方法。然后再创建TestPerson类,内含Main方法。在TestPerson类中创建两个Person对象分别为p1和p2。首先对p1进行赋值,然后通过clone()方法进行对p1的克隆也即为p2。编辑p2的属性赋值,最后输出p1结果,观察相应结果。
//进行Person类的编写
public class Person implements Cloneable {
private String name ;private int age ;
public Person() {super ();}
public Person(String name, int age) {super ();this . name = name;this . age = age;}
public String getName() {return name ;}
public void setName(String name) {this . name = name;}
public int getAge() {return age ;}
public void setAge( int age) {this . age = age;}
public Object clone() throws CloneNotSupportedException {return super .clone();}}
//编写TestPerson类public class TestPerson {@SuppressWarnings ( "null" )public static void main(String[] args) {Person p1= new Person( "张" ,100);Person p2= new Person();p2= null ;try {p2=(Person)p1.clone();} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}p2.setName( "李" );System. out .println(p1.getName());}}
输出结果:张
- 深克隆:当类中包含有引用类型(String除外)的属性时必须使用深克隆。
实现步骤:
- 实现数据类型的Cloneable接口(同浅克隆)
- 实现引用类型的Cloneable接口
- 重写Object的clone()方法
- 在Main方法中,进行克隆调用clone方法。
示例:分析:先定义以一个Person类,设置相应的属性和方法。其中设置Address为引用类型。然后再创建TestPerson类,内含Main方法。在TestPerson类中创建两个Person对象分别为p1和p2。首先对p1进行赋值(数据类型和引用类型),然后通过clone()方法进行对p1的克隆也即为p2。编辑p2的属性赋值,最后输出p1结果,观察相应结果。
//进行Person类的编写实现Object的Cloneable接口
public class Person implements Cloneable {
private String name ;private int age ;private Address add ;public Address getAdd() {return add ;}
public void setAdd(Address add) {this . add = add;}
public Person() {super ();}
public Person(String name, int age) {super ();this . name = name;this . age = age;}
public String getName() {return name ;}
public void setName(String name) {this . name = name;}
public int getAge() {return age ;}
public void setAge( int age) {this . age = age;}//深克隆public Object clone() throws CloneNotSupportedException {Person person=(Person) super .clone(); //克隆基本类型person. add =(Address) add .clone(); //克隆引用数据类型return person;}}//编写引用数据类型Address类public class Address implements Cloneable {private String prov ;private String city ;
public Address() {super ();// TODO Auto-generated constructor stub}
public Address(String prov, String city) {super ();this . prov = prov;this . city = city;}
public String getProv() {return prov ;}
public void setProv(String prov) {this . prov = prov;}
public String getCity() {return city ;}
public void setCity(String city) {this . city = city;}public Object clone() throws CloneNotSupportedException{return super .clone();}
}//编写TestPerson类public class TestPerson {@SuppressWarnings ( "null" )public static void main(String[] args) throws CloneNotSupportedException {Person p1= new Person();p1.setName( "张" );p1.setAdd( new Address( "湖北" , "武当" ));Person p2=(Person)p1.clone();p2.getAdd().setProv( "江西" );System. out .println(p1.getName());System. out .println(p1.getAdd().getProv());}}
输出结果: 张 湖北