以下为 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
实现 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 序列化
❓问题一:浅拷贝和深拷贝有什么区别?