谈谈Java中的浅克隆和深克隆
2018-07-21 本文已影响0人
扑哧咳哧
先说定义:
深克隆
克隆所得对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。深克隆的是实现实际上是对对象的序列化和反序列化.要实现深克隆被克隆类以及被克隆类的引用必须实现Serializable接口,否则会抛出NotSerializableException异常。
浅克隆
克隆所得的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。要实现浅克隆被克隆的类必须实现Cloneable接口.
复习:
值类型分为:
1,整数类型(byte,short,int,long)
2,浮点类型(float,double)
3,布尔类型(boolean)
4,字符类型(char)
除了值类型外就是引用值类型了,引用值类型有:
1,类类型(class)
2,数组
3,接口类型(interface)
注意字符串虽然是引用类型,但是通过函数传参改变字符串引用的值不会改变原引用值。
public class Self implements Cloneable, Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
int a = 0;
String b = "this is Self ";
//浅克隆
public Object clone() throws CloneNotSupportedException {
Self s = (Self) super.clone();
return s;
}
//深克隆
public Object deepClone() throws IOException, ClassNotFoundException {
//首先将对象写进二进制流
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
//再从二进制流读取对象,返回
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Self s = new Self();
//获得浅克隆对象
Self s_from_shallow = null;
try {
s_from_shallow = (Self) s.clone();
} catch (CloneNotSupportedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//获得深克隆对象
Self s_from_deep = null;
try {
s_from_deep = (Self) s.deepClone();
} catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//比较比较浅克隆和深克隆与父对象的引用类型是否相同
System.out.println(s.b == s_from_deep.b);
System.out.println(s.b == s_from_shallow.b);
/**
*
*/
}
}
结果是什么大家可以根据上面来推出哦。