Java中的Object类 (下篇)

 要么读书,要么旅行,身体和心灵总有一个要在路上。——罗马假日

 上篇我们讲了hashCode和equals方法,首先我们先回顾一下

  1. hashCode是根据一定的规则和对象相关的信息映射成一个数值,这个数值成为散列值。他是由native关键字修饰的,native关键字主要是Java平台与本地C代码进行交互的API,即为Java Native Interface(JNI)。
  2. equals关键字是用来比较对象是否相等的。如果使用Object的equals方法,实际上比较的是两个对象的内存地址是否相同,这与我们的初衷往往不一样。我们常见的类型,如String,Integer,Long等,JDK都为我们重写了equals方法,所以我们可以直接使用equals方法来实现对象数值的比较。如果是我们自定义的对象,就要手动重写equals方法。

如有不明白,可以看我另外一篇文章哈。传送门来了,Java中的Object类 (上篇)

今天我讲clone方法,他的作用就是快速创建一个已有对象的副本,克隆后的对象类型与被克隆对象的类型相同。

咱先简单使用:

public class Person implements Cloneable {
  private String id;
  private String name;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  protected Person clone() throws CloneNotSupportedException {
    return (Person) super.clone();
  }
}
public class Test {
  public static void main(String[] args){
     Person person1=new Person();
     person1.setId("1");
     person1.setName("张三");
     System.out.println("修改前的person1:"+person1.getId()+","+person1.getName());
     try {
       Person person2=person1.clone();
       System.out.println("修改前的person2:"+person2.getId()+","+person2.getName());
       person2.setId("2");
       person2.setName("李四");
       System.out.println("修改后的person2:"+person2.getId()+","+person2.getName());
       System.out.println("修改后的person1:"+person1.getId()+","+person1.getName());
     }catch (Exception e){
       e.printStackTrace();
     }
  }
}

Java中的Object类 (下篇)

我们来看一下,这些代码到底干了啥呢。

首先Person类重写了clone方法,同时也抛出了cloneNotSupportedException这个异常,也就是说这个这个类不支持cloneable接口,就会抛出异常,这也就解释了Person实现了Cloneable接口。

Java中的Object类 (下篇)

其次我们看一下clone方法里面,也就是调用了父类Object的clone方法。

最后我们看一下测试类Test,先定义了一个person1对象,并为其赋值,id为1,name为张三,这第一行输出没啥问题。然后调用Person类的clone方法,实现赋值的功能,产生了person2对象,第二行输出也没问题。再修改了person2对象,id为2,name为李四,第三行也就输出了修改后的值。最后输出了person1对象的值。

这整个过程看下来,clone在这个过程中实现了深克隆,也就是person1和person2是两个完全不同的对象,他们互不干扰。

相关文章: