Object类源码分析

package java.lang;

public class Object {

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

/注册本地方法,即初始化java方法映射到c方法/

 public final native Class<?> getClass();

/本地方法,返回一个对象运行时类/
eg: 类B继承类A,
A s=new B();
System.out.println(s.getClass()); //输出结果为B

public native int hashCode();

/本地方法,返回一个hash值/
在程序执行期间,只要equals方法比较操作用到的信息没有没修改,则对同一对象调用多次,hashcode方法返回的整数必定为同一整数;如果两个对象比较的equals方法相同,则调用hashcode方法返回的两个整数必定相同;如果;两个对象比较的equals方法不相同,则调用hashcode方法返回的两个整数不一定不相同。

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

/equals方法最根本的实现为==/
如果equals方法没有重写的话,它就和==比较的结果完全一样,如果重写了,在String类中,重写的equals方法比较的是内容,而“==”比较的是地址,可以片面的认为,重写的equals方法比较内容,不比较地址。

protected native Object clone() throws CloneNotSupportedException;

/本地方法,浅克隆/
调用该克隆方法必须要实现cloneable接口
浅克隆与深克隆相同点及不同点
浅克隆:仅仅复制它所考虑的对象,而不考虑它所引用的对象;
深克隆:它所考虑的对象和它所引用的对象都复制一份。

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

/返回信息,经常被重写 @Override/

public final native void notify();

/本地方法,唤醒一个在当前监视器上等待的线程/

public final native void notifyAll();

/本地方法,唤醒所有在当前监视器上等待的线程/

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

/本地方法,会抛出中断异常(InterruptedException),调用时要用try、catch捕捉/

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 > 0) {
        timeout++;
    }

    wait(timeout);
}

/会抛出中断异常(InterruptedException),调用时要用try、catch捕捉/

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

/本地方法,会抛出中断异常(InterruptedException),调用时要用try、catch捕捉/

protected void finalize() throws Throwable { }

/这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。/
C++有析构函数,能够很好地在对象销毁前做一些释放外部资源的工作,但是java没有。Object.finalize()提供了与析构函数类似的机制,但是它不安全、会导致严重的内存消耗和性能降低,应该避免使用。
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Object.assign是JavaScript中的一个方法,用于将一个或多个源对象中的所有可枚举属性复制到一个目标对象中。这个方法是浅拷贝的,只会复制对象的属性的值,不会复制对象的原型链。下面是对Object.assign源码分析Object.assign的定义如下: ```javascript Object.assign(target, ...sources) ``` 首先,我们分析源码中对于参数的处理。首先检查目标对象是否为null或undefined,如果是,则抛出一个TypeError。然后检查源对象是否为null或undefined,如果是,则直接返回目标对象。接下来,通过Object()方法将目标对象转换为一个Object型的对象。然后使用剩余参数语法将所有源对象放入一个数组中。 接下来,针对每个源对象,通过Object()方法将其转换为一个Object型的对象。然后使用for...in循环遍历每个源对象的可枚举属性,并将其复制到目标对象中,使用hasOwnProperty()方法判断属性是否来自源对象本身而不是原型链。在这个过程中,如果目标对象中已经存在同名属性,则会被源对象中的属性值覆盖。 最后,返回修改后的目标对象。 需要注意的是,Object.assign只会对源对象的属性进行浅拷贝。如果源对象的属性值是对象或数组,那么目标对象中的对应属性也会引用同一个对象或数组。 总结一下,Object.assign是一个用于将一个或多个源对象的可枚举属性复制到目标对象中的方法。它通过遍历源对象的属性并将其复制到目标对象中来实现。在使用过程中需要注意浅拷贝带来的引用问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值