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();
返回对象的运行时类。