jdk源码阅读之Object与Cloneable

Object 对象
(1)clone方法,是否可以克隆
protected native Object clone() throws CloneNotSupportedException;
这个方法是个native方法,是调用系统底层c/c++代码来实现拷贝复制的,这个方法抛出异常,Object子类如何调用clone方法呢?就是要实现Cloneable接口,通过查看Cloneable接口可以发现这个接口是空的,没有任何内容。其实这个接口是一个标志型接口,如果实现了这个接口就可以调用Object的clone方法,否则调用会抛出异常,这是java的规定。即使你重写了clone方法,但是没有实现Cloneable接口,调用就会抛出异常(记住这仅仅是规定,具体为什么这么规定肯定有他自己的道理)

public class TestDemo1 {
	public static void main(String[] args) throws Exception {

		TestDemo1 a = new TestDemo1();
		Object clone = a.clone();//会抛出异常,因为TestDemo1没有实现Cloneable接口

	}
}

如果TestDemo1实现了Cloneable接口,则a2.clone()就能正常执行,返回一个和a2一样的对象。

(2)equals方法

 public boolean equals(Object obj) {
        return (this == obj);
    }

很明显Object原生的equals方法是判断两个对象的引用是否相等,也就是两个引用是否引用的是同一个对象。如果是,返回true。
如果子类判断equals的尺度和这里不一样,比如说:两个对象的值是否相等,那么就要重写equals方法。对于java来说,重写equals方法,就必须重写hashCode方法,这只是一种规定,如果不重写hashCode方法,那么在使用Map一类的容器时,会出问题,具体解释见《Effective Java中文版》第9条.

(3)hashCode方法

    public native int hashCode();

这个方法返回一个哈希码,很明显这个值的作用是和哈希有关,在存取数据时,通过计算一个对象的哈希码,查找散列表可以快速定位对象的位置,而不是对一个散列表遍历。这也从另一个侧面反映哈希码不是对象的物理地址也不是逻辑地址,哈希码只是通过这个方法计算出来的一个尽可能分散的值,但也不排除不同的对象拥有相同的哈希码。

(4)toString方法

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

以字符串形式返回 类名@十六进制表示的哈希码。

猜你喜欢

转载自blog.csdn.net/whoami_I/article/details/85717789