1.传值和传址的区别
- java中基本数据类型(int等)的复制是传值复制。
- 对于对象而已,却是复制对象引用。所以简单的赋值操作符
obj1 = obj2
是不起作用的.obj1和obj2都指向同一个内存对象。 - 函数式编程,第三公民的不同(后面补)
2.对象克隆
万对象之源:Object对象有个clone()方法,实现了对象中各个属性的复制。实体类实现克隆的方法:
- 实现Cloneable接口,否则会抛出无法克隆异常(
CloneNotSupportedException
)。 - 覆盖clone()方法,可见性提升为public。
public class Obj1 implements Cloneable{
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
3.使用
Obj obj1 = new Obj();
Obj obj2 = (Obj) obj1.clone;
4.浅克隆和深克隆的区别
- 浅克隆:被复制对象的所有值属性都含有与原来对象的相同,而所有的对象引用属性仍然指向原来的对象。
- 深克隆:在浅拷贝的基础上,所有引用其他对象的变量也进行了clone,并指向被复制过的新对象。
- 简单来说就是Object对象提供的clone方法,仅仅克隆本源对象的基本属性,本源对象如果包含有对象,则这些对象一样是传址复制,不会产生一个新对象。
- 所以想要实现深克隆,该对象的所有引用对象都需要实现
cloneable
接口并覆盖clone()
方法。 - 同时必须在该对象的
clone()
方法中clone其他对象。如果这个对象包含的饮用对象也包含其他对象。。。。只能一路修改相应的clone()
方法。
@Override
public Object clone() throws CloneNotSupportedException {
Object obj=super.clone();
Address a=((Person)obj).getAddress();
((Person)obj).setAddress((Address) a.clone());
return obj;
}
5.第三方克隆库
- java如此对clone进行限制,可见,不到万不得已还是不要使用克隆。使用前建议想想,是不是程序设计模式有问题,导致一定需要clone
- 如下是在第三方克隆库下作者的建议:deep cloning of Java classes might mean thousands of objects are cloned! Also cloning of files and streams might make the JVM crash。
- 如果非要克隆对象,建议使用如下第三方库。不用大费周章的覆盖clone方法,实现cloneable接口。
网友评论