API(object克隆)

  1. 克隆分为浅克隆和深克隆
  2. 浅克隆:不管对象内部的属性是基本数据类型还是引用数据类型,都完全拷贝,object类中的克隆是浅克隆
  3. 深克隆:基本数据类型拷贝过来,字符串复用,引用数据类型会创建新的
  4. object是Java中的顶级父类,所有的类都直接或间接的继承于object
  5. toString()一般会重写,用于打印元素
  6. equals()比较对象时会重写,比较对象属性值是否相等
  7. clone()有深克隆或者浅克隆,深克隆需要重写方法或者使用第三方工具
  8. 案例:测试类
    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;



}
}
posted @ 2023-01-20 20:22  为zq  阅读(47)  评论(0)    收藏  举报