【Java笔记】对深克隆和浅克隆,以及多种equals方法的理解

发布于:2022-08-01 ⋅ 阅读:(300) ⋅ 点赞:(0)

    之前学的时候有了解到深克隆和浅克隆这两个概念,有点小模糊,但是我也想记录一下自己的一些理解。不是很严谨和全面,只是我的一些学习过程。

    这个克隆有什么用,深克隆和浅克隆的区别在什么地方啊?

    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,而不会报错。

写得很乱,估计只有我自己才能看懂的垃圾文字了,碎碎念,记录一下。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到