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());
}
以字符串形式返回 类名@十六进制表示的哈希码。