对象克隆的应用场景是创建一组细粒度重复使用的对象时,效率会比直接创建对象高。比如:在飞机大战游戏中,飞机的子弹,如果要创建对象会消耗大量的资源和时间,对于飞出来的子弹到飞出屏幕外就使对象消失的情况,克隆的优势就是不需要多次计算这个对象在内存的大小,直接填充数据,在JVM处理的时候会比大量多次创建对象省去很多步骤。
如果某个类的对象想要被克隆,这个类就需要实现Cloneable接口。(这个接口没有定义任意方法,就是一个标记接口。),然后实现Object中的clone方法。
import java.util.Objects;
public class demo_clone {
public static void main(String[] args) {
Cat2 cat = new Cat2("铂西",21);
try {
//避免不能转换的异常
Cat2 cat1 = (Cat2) cat.clone();
System.out.println(cat == cat1);
System.out.println(cat);
System.out.println(cat1);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
/**
* 对象具备克隆功能
* 1.实现Cloneable接口
* 2.重写clone方法
*/
class Cat2 implements Cloneable{
private String name;
private int age;
//重写方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Cat2(String name, int age) {
this.name = name;
this.age = age;
}
public Cat2() {
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Cat2 cat = (Cat2) o;
return age == cat.age && Objects.equals(name, cat.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}