API(object克隆)
- 克隆分为浅克隆和深克隆
- 浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝,object类中的克隆是浅克隆
- 深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型会创建新的
- object是Java中的顶级父类,所有的类都直接或间接的继承于object
- toString()一般会重写,用于打印元素
- equals()比较对象时会重写,比较对象属性值是否相等
- clone()有深克隆或者浅克隆,深克隆需要重写方法或者使用第三方工具
- 案例:测试类
public class clonetext {
public static void main(String[] args) throws CloneNotSupportedException {
//protect object clone(int a) 对象的克隆
//1:先创建一个对象
int[] data = {1,2,34,5,};
user u1 = new user(1,2,data);
//2:克隆对象
//原理:方法在最底层会帮我们创建一个对象,并把原对象中的数据拷贝过去
//书写细节:要重写object类中clone方法
//让JavaBean类实现Cloneable接口
//创建原对象,并调用clone方法,这里注意强制转化
user u2 =(user)u1.clone();
int[] array = u1.getData();
array[0]=100;
System.out.println(u1);
System.out.println(u2);
}
}
Javabean类:
//CloneABLE
//在Java中,如果接口里面没有抽象方法,表示当前的接口是一个标志性接口
//现在Cloneable接口一旦实现,那么当前类的对象就可以被克隆,反之则不能被克隆
public class user implements Cloneable {
private int age;
private int name;
private int[] data;
public user() {
}
public user(int age, int name, int[] data) {
this.age = age;
this.name = name;
this.data = data;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getName() {
return name;
}
public void setName(int name) {
this.name = name;
}
public int[] getData() {
return data;
}
public void setData(int[] data) {
this.data = data;
}
@Override
public String toString() {
return "user{" +
"age=" + age +
", name=" + name +
", data=" + Arrays.toString(data) +
'}';
}
//重写clone方法
@Override
protected Object clone() throws CloneNotSupportedException {
//调用父类中的clone方法,相当于让Java帮我们克隆一个对象,并把克隆之后的对象返回出去
//先把克隆对象中的数组获取出来
int[] data = this.data;
//创建一个新的数组
int[] newData = new int[data.length];
//将原数组拷贝到新数组
System.arraycopy(data,0,newData,0,data.length);
//调用父类中的方法克隆对象
user u = (user) super.clone();
//因为父类的克隆方法是浅克隆,替换克隆出来对象的数组地址值
u.data=newData;
return u;
}
}

浙公网安备 33010602011771号