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();
返回对象的运行时类。
标签:10,Java,human,clone,Object,Human,mother,public,name 来源: https://www.cnblogs.com/knhap/p/16275320.html