Clone
-
clone
是Object类的一个方法
- 也可以通过类本身实现
Cloneable
接口来重写clone
的方法. Cloneable
接口本身并没有clone
的方法如果不实现就重写会报java.lang.CloneNotSupportedException
的异常
- Object的
clone
方法会复制对象的值但是引用类型的属性复制后的对象仍然指向原先的内存地址也就是一种浅拷贝
new
-
new
是java中的关键字。他主要用来创建对象,然后调用类的对应构造方法。它会在JVM中重新生成一块空的内存空间。
两者的区别
- 由于clone是直接的复制,而new则要调用构造方法,创建对象时要赋值初始化所以在复杂对象的创建上clone的效率会高于new一些。
- 需要注意的是Object的clone是浅拷贝,如果要实现深拷贝需要实现Cloneable接口重写clone的方法例如下面
public class Cat implements Cloneable{
private String id;
private String name;
private Ball ball;
public Cat clone() throws CloneNotSupportedException {
Cat a = (Cat) super.clone();
a.ball = (Ball) this.ball.clone();
return a;
}
@Override
public String toString() {
return "Cat{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
public static void main(String[] args) throws CloneNotSupportedException {
Cat a=new Cat();
a.ball = new Ball();
Cat b = a.clone();
System.out.println(a.ball==b.ball);
}
}
public class Ball implements Cloneable{
private String id;
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}