java源码分析01-Object源码分析

最近趁着工作前的空闲时间,研究一下JDK的源码,学习java大师的编程风格。

我们从Object类开始,它是所有类的父类,如果一个类没有使用extends关键字来指定继承某个类时,默认继承自Object类。

所有的抽象类也可以继承自Object类。

首先我们来看下Object类的结构:

构造方法Object(), 如果没有显示的指定任何构造函数,那么编译器会自动帮该类添加一个默认构造方法。

对象相关的方法:Object(),getClass(),clone(),finalize(),toString()

对象比较:equals(),hashcode()

多线程相关:wait(),notify(),notifyAll()

静态代码块:

private static native void registerNatives();
    static {
        registerNatives();
    }



Object():

构造方法,用于构造对象,即使使用反射机制,也需要使用构造器指定,因此,使用反射需要无参构造,还可以

设定单例模式等


getClass():public final native Class<?> getClass();

获取对象的Class对象,包括类信息,方法信息,属性信息。可用于反射机制。


clone()方法:protected native Object clone() throws CloneNotSupportedException;

对象的复制,对于java设计模式中的原型设计模式,分为浅复制和深复制。

浅复制和深复制的区别在于:属性值为对象引用的时候,复制时是否需要创建新的对象,还是只是指向原有的对象。


toString()方法:

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


打印对象,默认打印方式为对象的类全路径@对象的hashcode(十六进制形式)

一般需要重写此方法,来增强可读性。ps:eclipse中有自动重写的快捷键。


finalize()方法: protected void finalize() throws Throwable { }

用于垃圾回收前的处理工作,即非内存资源的回收,但是不建议使用,可用finally中处理来替代。


equals()方法: 

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


对象的逻辑上的比较,也就是自定义的比较方式。一般用来比较对象的内容。


hashcode()方法: public native int hashCode()

对象的哈希值,一般用来描述对象的物理内存地址,可以重写用于散列结构,例如HashMap等


wait()方法: 

public final native void wait(long timeout) throws InterruptedException;

 

public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
    }
 public final void wait() throws InterruptedException {
        wait(0);
    }

用于多线程调度时,暂停当前线程,然后释放其占用的对象锁,让其他线程抢占CPU。


notify()方法: public final native void notify();

随机唤醒一个等待对象锁的线程。


notifyAll()方法:public final native void notifyAll();

唤醒所有的等待对象锁的线程。


其中有很多final native方法,代表底层实现是采用非java代码实现,对应java内存模型中的本地方法栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值