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

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

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一支猫咔qly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值