1、 public class Object
2、Java通过registerNatives 私有方法注册一些本地方法,通过静态代码
调用。
private static native void registerNatives();
static {
registerNatives();
}
3、hashcode和equals方法。用来判断两个对象是否相等,为什么需要hashCode方法? 因为重写的equals方法一般比较全面复杂,这样效率就低,而利用hashCode比较,只需生成一个hash值进行比较就行了,效率高,那为什么还需要equals方法呢?因为同一个对象的hashCode一定一致,而不同对象的hashCode也可能一致,因此若两个对象hashCode不一致,则两个对象肯定不相等;若两个对象hashCode一致,再利用equals方法比较。也就是说equals相等的对象其hashCode一定一致。
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
4、protected native Object clone() throws CloneNotSupportedException;
clone方法时native方法,效率高于非native方法;只有实现了Cloneable接口的类才能调用clone方法,否则会抛出方法声明的异常;clone方法不走构造函数,得到的对象是新的对象;Object提供的是浅克隆,只克隆了自身对象和对象内实例变量的地址引用,它内部的实例变量还是指向原先的堆内存区域。深克隆则拷贝了所有。也就是说深克隆能够做到原对象和新对象之间完全没有影响。
创建并返回此对象的一个副本。对于任何对象x,表达式:
(1)x.clone() != x为true
(2)x.clone().getClass() == x.getClass()为true
(3)x.clone().equals(x)一般情况下为true,但这并不是必须要满足的要求
利用序列化进行深克隆(完整代码见demo/src/lwh/test/TestBean.java)
public Object deepClone() throws Exception{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
利用clone方法实现深克隆,其中Customer中含有Address引用,使用下面方法克隆之后,克隆之后的对象再修改Address内容不会改变原对象的Address。(完整代码见demo/src/lwh/test/Customer.java)
@Override
public Address clone() throws CloneNotSupportedException{
return (Address)super.clone();
}
@Override
public Customer clone() throws CloneNotSupportedException{
Customer customer = (Customer)super.clone();
customer.address = address.clone();
return customer;
}
Object源码学习笔记
最新推荐文章于 2024-06-19 20:27:39 发布