先讲一讲Java 中equals() 和==的区别
1. 基本数据类型(byte,short,char,int,long,float,double,boolean)
双等号(==)和 equals ,比较的是他们的值。
2. 类
当使用==比较的是两个对象的内存地址
当时用equals比较的也是内存地址 ,因为Object类中的equals方法就是用==比较的
什么是浅拷贝?什么是深拷贝?
一般对于类而言
深拷贝: 对基本数据类型进行值传递,对引用数据类型,创建一个新的,对其进行赋值。(两个指针指向不同的内存单元)
浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用(类似C 中的指针,等于两个指针指向同一个内存单元)
比如:
当使用浅拷贝中的clone
测试结果如下,f1与f2中的成员变量并不相等。
所以说如果要深拷贝必须将所有的成员变量都进行clone
在写浅拷贝和深拷贝之前,还需要了解Java中的Clone
可以看到如果类没有实现Cloneable接口就会报错,如果实现了就调用 internalClone() , internalClone() 这个方法会返回一个这个类的一个新实例。
所以说如果一个类需要调用Clone(), 那么这个了类需要实现Cloneable 接口
Cloneable 接口 只起到一个标识作用,表明这个类需要用到Clone()方法。
如何进行浅拷贝?如何进行深拷贝
浅拷贝
如图中的clone()方法 ,这就实现了浅拷贝
首先,这个类中有一个名为SonObject的子类。并且FatherObject 实现了Cloneable接口,并且Clone() 方法调用了Object中的Clone()方法。
深拷贝
实现浅拷贝有两种方法,一种是利用Object中的Clone() ,一种是将类序列化然后再反序列化.
1. 利用Object中的clone()
图中实现了深拷贝的clone
2. 先序列化,反序列化
网络上的列子挺多的,这里就不详细描述。