clone方法是在复制一个引用对象,复制的对象是单独独立的,有独自的内存空间
clone方法是java中顶层父类Object中的一个方法,此方法在Java中未实现,是一个native方法,
也就是本地方法(即可以调用底层操作系统的方法),
在调用本地方法时创建对象比直接New创建对象,效率会高
如何使用clone复制对象?
在使用clone方法创建一个对象时,必须实现一个接口:Cloneable,此接口没有任何方法,
是一个标识接口,由于Object类中clone方法的权限修饰是projected,所以我们在克隆对象时,
被克隆对象要重写clone方法,并且把权限修改成public,
分类:克隆被分为:浅克隆:在克隆对象时,只会把基本数据类型的数据进行复制
如果是引用类型,只会把引用的地址复制过去,
也就是被克隆的对象和原始对象,共同使用同一个地址的引用对象
当此对象地址的值被改变时,克隆对象和原始对象的该属性值都会被改变
深克隆:在克隆对象时,只会把基本类型的数据和引用类型的数据同时复制
引用类型的属性会被复制两份,有两个地址
其中一个被改变,另一个不会被影响
缺点:在深克隆时,如果引用对象关系比较复杂,克隆时会很麻烦,因为每一个
clone方法是java中顶层父类Object中的一个方法,此方法在Java中未实现,是一个native方法,
也就是本地方法(即可以调用底层操作系统的方法),
在调用本地方法时创建对象比直接New创建对象,效率会高
如何使用clone复制对象?
在使用clone方法创建一个对象时,必须实现一个接口:Cloneable,此接口没有任何方法,
是一个标识接口,由于Object类中clone方法的权限修饰是projected,所以我们在克隆对象时,
被克隆对象要重写clone方法,并且把权限修改成public,
分类:克隆被分为:浅克隆:在克隆对象时,只会把基本数据类型的数据进行复制
如果是引用类型,只会把引用的地址复制过去,
也就是被克隆的对象和原始对象,共同使用同一个地址的引用对象
当此对象地址的值被改变时,克隆对象和原始对象的该属性值都会被改变
深克隆:在克隆对象时,只会把基本类型的数据和引用类型的数据同时复制
引用类型的属性会被复制两份,有两个地址
其中一个被改变,另一个不会被影响
缺点:在深克隆时,如果引用对象关系比较复杂,克隆时会很麻烦,因为每一个
对象都要克隆。
解决方案:用序列化进行解决
附上深克隆和浅克隆的区别代码
package practice.clone;
public class TestClone {
public static void main(String[] args) throws CloneNotSupportedException {
Student s = new Student("tom",34,new Address("苏州"));
Student stu = (Student) s.clone();
Address aa = s.getAddress();
aa.setCity("南京");
s.setAddress(aa);
System.out.println(s.getAddress().getCity() + "==="+stu.getAddress().getCity());
}
}
package practice.clone;
/**
* 深度克隆和浅度克隆的区别:Address也要实现接口Cloneable
* @author dell
*
*/
public class Address implements Cloneable {//深度克隆和浅度克隆的区别
private String city;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public Address(String city) {
super();
this.city = city;
}
public Address() {
super();
// TODO Auto-generated constructor stub
}
@Override
public Object clone() throws CloneNotSupportedException {//深度克隆和浅度克隆的区别
Address a = null;
a = (Address) super.clone();
return a;
}
}
package practice.clone;
public class Student implements Cloneable{
private String name;
private int age;
private Address address;
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 Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Student(String name, int age,Address address) {
super();
this.name = name;
this.age = age;
this.address = address;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
@Override
public Object clone() throws CloneNotSupportedException {
Student s = null;
s = (Student) super.clone();
Address a = s.getAddress();//深度克隆和浅度克隆的区别(去掉就是浅克隆)
s.setAddress((Address)a.clone());//深度克隆和浅度克隆的区别
return s;
}
}
深克隆输出:南京===苏州
浅克隆输出:南京===南京
原因:引用类型Address在深克隆时同样被复制;但在浅克隆时,s 和 stu对象使用的是同一地址的Address,故改变都改变