Java学习笔记90——Object类—colne方法

Object类——clone方法

protected Object clone()

创建并返回此对象的副本。

protected void finalize() throws Throwable当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。 一个子类覆盖了处理系统资源或执行其他清理的finalize方法。 这个方法简单理解为就是用来垃圾回收的,什么时候回收呢?不确定。 GC机制

clone的方法Object执行特定的克隆操作。

首先,如果此对象的类不实现接口Cloneable ,则抛出CloneNotSupportedException 。 将想要调用克隆方法的类实现Cloneable接口 通过观察API发现,Cloneable接口中没有成员变量也没有成员方法 今后看到类似于Cloneable接口里面什么都没有的接口,我们称之为标记接口

拷贝在IT行业中常见两种:

浅拷贝 拷贝的时候,重新创建一个对象,成员变量值和被拷贝的一样,但是后续修改与原先的没有关系 深拷贝 拷贝的时候,没有创建新的对象,只是改个名字,地址值都一样,修改拷贝后的连带影响到原先的

import java.util.Objects;
​
public class Student5 implements Cloneable{
    private String name;
    private int age;
​
    public Student5() {
    }
​
    public Student5(String name, int age) {
        this.name = name;
        this.age = 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;
    }
​
//    @Override
//    public String toString() {
//        return  "姓名:" + name + ",年龄:" + age;
//    }
​
​
    @Override
    public String toString() {
        return "Student3{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
​
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student5 student5 = (Student5) o;
        return age == student5.age &&
                Objects.equals(name, student5.name);
    }
​
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class StudentTest4 {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student5 s1 = new Student5("华根", 18);
        System.out.println(s1.toString());
​
        //CloneNotSupportedException
        //这里其实隐含了多态
        Object obj = s1.clone();
//
        System.out.println(obj.toString());
        Student5 s2 = s1;
        System.out.println(s2.toString());
​
        System.out.println("**************************");
        s2.setAge(20);
//        ((Student5)obj)
        System.out.println(s1.toString());//Student3{name="华根",age=20}
        System.out.println(s2.toString());//Student3{name="华根",age=20}
        System.out.println(obj.toString());//Student3{name="华根",age=18} clone的是初始值
    }
}
posted @ 2021-12-15 21:20  欧朋  阅读(71)  评论(0)    收藏  举报