面试题答案
一键面试- 实现
Cloneable
接口:- 在Java中,要使用
clone
方法,类必须实现java.lang.Cloneable
接口。这个接口是一个标记接口,里面没有任何方法。例如:
public class MyClass implements Cloneable { // 类的其他成员 }
- 在Java中,要使用
- 重写
clone
方法:clone
方法在Object
类中定义,访问修饰符是protected
。所以在自定义类中重写时,通常要将其访问修饰符改为public
。clone
方法内部常见操作如下:- 调用超类的
clone
方法:首先调用super.clone()
。Object
类的clone
方法会创建一个新的对象,其成员变量值与当前对象相同(对于基本数据类型是值复制,对于引用数据类型是引用复制,即浅拷贝)。例如:@Override public Object clone() throws CloneNotSupportedException { return super.clone(); }
- 处理深拷贝(如果需要):
- 如果类中有引用类型的成员变量,并且希望实现深拷贝(即复制引用对象本身而不是引用),则需要手动处理。比如类中有一个
List
成员变量:
import java.util.ArrayList; import java.util.List; public class MyClass implements Cloneable { private List<Integer> list; public MyClass() { list = new ArrayList<>(); } @Override public Object clone() throws CloneNotSupportedException { MyClass cloned = (MyClass) super.clone(); cloned.list = new ArrayList<>(this.list); return cloned; } }
- 如果类中有引用类型的成员变量,并且希望实现深拷贝(即复制引用对象本身而不是引用),则需要手动处理。比如类中有一个
- 调用超类的
- 异常处理:
super.clone()
可能会抛出CloneNotSupportedException
异常,所以在重写的clone
方法中要么声明抛出该异常,要么在方法内部捕获处理。如果类实现了Cloneable
接口,super.clone()
一般不会抛出该异常,但为了代码的完整性和遵循Object
类clone
方法的定义,建议声明抛出该异常。