之前学的时候有了解到深克隆和浅克隆这两个概念,有点小模糊,但是我也想记录一下自己的一些理解。不是很严谨和全面,只是我的一些学习过程。
这个克隆有什么用,深克隆和浅克隆的区别在什么地方啊?
clone()方法其实就是那个“祖宗类”object的一个方法。
我后面想着,如果我玩一个游戏,游戏里面肯定会有不同的区服,什么电信区啊,联通区啊,我在电信区有账号,但是在联通区没有,有一天我想去联通区玩,这个时候我在电信区的所有账号信息就要拷贝到联通区去,这样的情况用克隆就很方便了哈。
深克隆和浅克隆的区别我的理解就是,浅克隆质数单纯的将原对象中的变量(属性值)在内存中的地址赋给了克隆出来的对象的相应的变量,浅克隆的有一个不好又不好的地方就是,一旦我原来的被克隆的对象中的某些变量发生改变,克隆出来的新对象也会发生改变。
我们来看一下是不是吧:
我在简单创建一个person类后,发现好像没有clone()这个方法啊?不应该啊,person类肯定是Object类的子类的,为什么它的方法我没能继承下来用啊?
我们看到Object类中clone()方法的源码发现,这个方法是用 protected 来进行修饰的。
所以我们要用到这个方法,还要的在person类中重写一下这个方法。
然后我们还要实现一个Cloneable接口,实现之后,我们创建的这个JavaBean类才可以被克隆。
这样就能调用clone()方法了,但是,这个object的clone()是深克隆还是浅克隆呢?
我们试一下:
结果是:
一旦我改变了p1对象中的属性值,看一下克隆出来的p2的变化
所以可以看出是浅克隆的。
如果要进行深克隆,则需要对clone()方法再进行重写,创建新的变量来记录。
还有就是偷懒,导入其他大牛写的代码到我们的项目中。
复制他人写的jar到我们的项目中,然后右键add as library
然后就添加完成了。
最后就简单用一下大牛的代码,我们就可以进行深克隆了。
package demo;
import com.google.gson.Gson;
import java.util.Objects;
public class test {
public static void main(String[] args) throws CloneNotSupportedException {
Person p1=new Person("张胜男",18);
Gson g= new Gson();
String s2 = g.toJson(p1);
Person p2 = g.fromJson(s2, Person.class);
p1.setAge(19);
System.out.println(p1.toString());
System.out.println(p2.toString());
}
}
结果:
对多种equals方法的理解
Object类里的equals方法是比较两个对象的地址值是否相同,而不是比较这两个对象里的属性值,所以我感觉比较不太实用。
所以一般在JavaBean类中会重写一下这个equals方法:
单对我写的这个person类而言
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
这样就可以比较两个person对象中的姓名和年龄了,如果姓名和年龄都相同,就返回true,反之返回false。
但是这个也是有一个小不妥的地方,如果我要比较的两个对象中,其中一个是空对象(null),这样的话就会报错了。
解决这个问题就可以用Objects类中的equals方法,在其中如果是有空对象的话,它能够直接返回一个false,而不会报错。
写得很乱,估计只有我自己才能看懂的垃圾文字了,碎碎念,记录一下。