10_Java基类Object

java.lang.Object 是 Java 类结构中其他所有类的超类。

clone

protected native Object clone() throws CloneNotSupportedException; 

clone 方法返回当前对象的副本对象。

Object 将 clone 作为一个本地方法来实现。当执行 clone 的时候,会检查调用对象的类(或者父类)是否实现了java.lang.Cloneable接口( Object 类不实现 Cloneable )。如果没有实现这个接口,将会抛出一个检查异常 — java.lang.CloneNotSupportedException,如果实现了这个接口,会创建一个新的对象,并将原来对象的内容复制到新对象,最后返回这个新对象的引用。

浅克隆与深克隆

Object 类的 clone 方法是浅克隆,浅克隆对于字符串以外的引用数据类型克隆的是地址。深克隆则可以进行完全克隆。

  • 浅克隆
public class Human implements Cloneable {      public String name;      public int age;      public Human mother;      @Override     public Object clone() throws CloneNotSupportedException {         return super.clone();     } } 
public static void main(String[] args) throws CloneNotSupportedException {   Human mother = new Human();   mother.name = gm;   mother.age = 50;    Human human = new Human();   human.name = kh;   human.age = 25;   human.mother = mother;    Human copyMan = (Human) human.clone();    System.out.println(human == copyMan); // false   System.out.println(human.name == copyMan.name); // true   System.out.println(human.mother == copyMan.mother); // true  } 
  • 深克隆
public class Human implements Cloneable {      public String name;      public int age;      public Human mother;      @Override     public Object clone() throws CloneNotSupportedException {         Human human = (Human) super.clone();         if(mother != null) {             human.mother = (Human) mother.clone();         }         return human;     } } 
public static void main(String[] args) throws CloneNotSupportedException {   Human mother = new Human();   mother.name = gm;   mother.age = 50;    Human human = new Human();   human.name = kh;   human.age = 25;   human.mother = mother;    Human copyMan = (Human) human.clone();    System.out.println(human == copyMan); // false   System.out.println(human.name == copyMan.name); // true   System.out.println(human.mother == copyMan.mother); // false  } 

toString

public String toString() {         return this.getClass().getName() + @ + Integer.toHexString(this.hashCode()); } 

源码中 toString 方法返回的是 类名 + @ + 当前对象的哈希值,以此表示当前对象,可根据需要重写。

equals 和 hashCode

public boolean equals(Object var1) {   return this == var1; } 
public native int hashCode(); 
  • 如果根据 equals 方法两个对象相等,则 hashCode 相等;equals 不相等,hashCode 可能相等

hashCode 相等,equals 可能不相等,但是,为 equals 不等对象生成不同的 hashCode 可能会提高哈希表的性能。

  • 一般需要同时重写 equals 和 hashCode 方法,确保 equals 相等时 hashCode 相等。

finalize

protected void finalize() throws Throwable { } 

当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用。

getClass

public final native Class<?> getClass(); 

返回对象的运行时类。