对象克隆
Object类中定义一个clone方法
native方法用于声明一个非java语言实现的代码,供java程序调用。因为java语言程序是运行在JVM上, 如果要访问比较底层的与操作系统相关的方法就没有办法了,只能通过比较靠近系统的语言来实现,比 如C/C++。
Object a=new Object();
Object b=a; //变量b中存储的是变量a的引用值,a和b指向的是同一个对象
Object a=new Object();
Object b=a.clone(); //b是a的克隆对象,具有a对象当前所有状态,但是b和a不是同一个对象
Java中有两种不同的克隆方法:浅克隆(shallowClone)和深克隆(deepclone)。浅克隆不支持引用类型成员 变量的复制,仅仅只是克隆的地址;深克隆支持引用类型成员变量的复制
浅克隆
1、被复制的类需要实现Cloneable接口,该接口也是旗标接口,不包含任何方法
2、在当前类种覆盖定义clone方法,将访问限定词设置为public。具体实现调用super.clone实现
浅克隆只会克隆引用类型属性的地址,并不是完整克隆引用类型属性。将会出现源对象和克隆对象的该属性指向同一个对象属性。在浅克隆种当对象被复制时他本身和其中包含的值类型的成员属性,而引用类型的成员对象并没有复制
public class Teacher implements Cloneable{
private String name;
private int age;
public Teacher(String name, int age){
this.name = name;
this.age = age;
}
// 覆盖
@Override
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
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 class test {
Teacher origin = new Teacher("tony", 11);
System.out.println(origin.getName());
Teacher clone = (Teacher) origin.clone();
clone.setName("clone");
System.out.println(origin.getName());
System.out.println(clone.getName());
}
深克隆
在深克隆种无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象。这里的区别于浅克隆,对于原型对象的所有引用类型的属性对象也复制一份给克隆对象,不是地址复制。
在java中实现深克隆有2种方案:可以覆盖Object的clone方法实现;也可以通过序列化实现。一般都是采用序列化的方式实现,注意实现序列化的前提是序列化接口
类定义需要实现序列化接口,当然为保证引用类型属性也能序列化,所以引用类型属性也必须实现序列化接口。