Object源码学习笔记

1public 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);
}

4protected native Object clone() throws CloneNotSupportedException;
clone方法时native方法,效率高于非native方法;只有实现了Cloneable接口的类才能调用clone方法,否则会抛出方法声明的异常;clone方法不走构造函数,得到的对象是新的对象;Object提供的是浅克隆,只克隆了自身对象和对象内实例变量的地址引用,它内部的实例变量还是指向原先的堆内存区域。深克隆则拷贝了所有。也就是说深克隆能够做到原对象和新对象之间完全没有影响。
创建并返回此对象的一个副本。对于任何对象x,表达式:
(1)x.clone() != x为true2)x.clone().getClass() == x.getClass()为true3)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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值