MST

星途 面试题库

面试题:Java中对象克隆的两种方式及区别

在Java中,实现对象克隆通常有两种方式,请简述这两种方式分别是什么,并说明它们之间的区别。
45.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 实现Cloneable接口并重写clone方法
    • 方式:让需要克隆的类实现java.lang.Cloneable接口,该接口是一个标记接口,没有任何方法。然后在类中重写protected修饰的clone方法,在clone方法中调用super.clone()来完成对象的克隆。
    • 特点:这种方式实现的是浅克隆,即如果对象中包含引用类型的成员变量,克隆后的对象和原对象的引用类型成员变量指向同一个对象。
  2. 实现Serializable接口并通过对象流进行克隆
    • 方式:让需要克隆的类实现java.io.Serializable接口,该接口也是一个标记接口。然后通过将对象写入ObjectOutputStream,再从ObjectInputStream读取来创建一个新的对象,本质上是通过序列化和反序列化来实现克隆。
    • 特点:这种方式实现的是深克隆,即克隆后的对象和原对象的引用类型成员变量会重新创建,不会指向同一个对象,所有层次的对象都会被克隆。

区别

  • 克隆深度:实现Cloneable接口并重写clone方法默认是浅克隆;而通过实现Serializable接口利用对象流克隆是深克隆。
  • 实现复杂度:实现Cloneable接口方式相对简单,只需实现接口并重写clone方法;而通过Serializable接口利用对象流克隆,涉及到对象的序列化和反序列化,代码相对复杂。
  • 应用场景:如果对象中没有复杂的引用类型嵌套,浅克隆(Cloneable方式)就可以满足需求,性能较高;如果对象中包含多层引用类型嵌套,需要完全独立的副本,深克隆(Serializable方式)更合适。