以下为 Jean 学习笔记和习题整理,供学习和参考

# 浅拷贝

只拷贝源对象的地址,所以源对象的任何值发生改变时,拷贝对象的值也会随之发生改变。

创建一个新的对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段进行复制,如果该字段是引用类型的,则复制但不复制引用的对象,因此,原始对象及其副本引用同一个对象。

# 浅拷贝 Demo

// 如果一个 User 对象有 username 和 password 两个属性
User user01 = new User();
// 浅拷贝
User user02 = user01;
// 此时 user02 做任何修改时 user01 会被修改,同时 user01 做任何修改时 user02 也会被修改。

user01 和 user02 指向的是同一个地址。

# 深拷贝

拷贝了源对象的所有值而不是地址,所以即使源对象的值发生任何变化时,拷贝对象的值也不会发生改变。

# 常见的深拷贝方式:

# 1. 构造函数方式:

构造函数创建的永远是新对象,互不干扰,在创建对象过多的时候,对系统开销很大,不推荐。

1. 在 bean 对象中添加有参的构造函数。

2. 修改各自对象互不影响,,,,有点寂寞,

# 2. 重写 clone 方法

1. 重写 Object 父类继承而来的 clone 方法,并修改为 public

public class User implements Cloneable

  1. 实现 Cloneable 接口来告诉 JVM 此类允许拷贝

    @Override

    public User clone() throws CloneNoSupportedException{

    ​ return (User)super.clone();

    }

    // 如果一个 User 对象有 username 和 password 两个属性
    User user01 = new User();
    // 浅拷贝
    User user02 = user01.clone();
    // 此时 user02 做任何修改时 user01 不会被修改,同时 user01 做任何修改时 user02 也不会被修改。

# 3.Apache 序列化

序列化是指将对象写到流中便于传输,而反序列化则是把对象从流中读取出来,这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。

每个序列化的类都要实现 Serializable 接口,如果某个属性不需要序列化,可以将其声明为 transaction,将其排除在克隆属性之外。

# 4.Gson 序列化

# 5.Jackon 序列化

问题一:浅拷贝和深拷贝有什么区别?

更新于

请我喝[茶]~( ̄▽ ̄)~*

Jean 微信支付

微信支付

Jean 支付宝

支付宝

Jean 贝宝

贝宝