Java常用类型Object 详解

首先我们要分析Object,首先药去看一下源码,以下就是从Object类里面拿出来的:

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
    public final native Class<?> getClass();

    public native int hashCode();

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

    protected native Object clone() throws CloneNotSupportedException;

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

    public final native void notify();

    public final native void notifyAll();

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

        wait(timeout);
    }

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

    protected void finalize() throws Throwable { }
}

可以看到,里面主要包含这么几种方法

getclass()

 public final native Class<?> getClass();

这个一般是返回对象的类型,例如:

Student stu=new Student();
stu.getclass();

这里返回的就是Student的全类名,一般与getName连用,stu.getclass().getName();这样返回的就是Student

hashcode()

public native int hashCode();

这个是一个本地的方法,在我的理解看来,就是返回对象的物理地址(其实并不是),反正就是一个在计算机内存里面存储地址的这样一个类似的东西,一般重写了equals()方法就要重写hashcode(),关于这方面,我后期会出一篇文章讲解记录一下。

equals()

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

在object类中,hashcode()方法是本地方法,返回的是对象的地址值,而object类中的equals()方法比较的也是两个对象的地址值,如果equals()相等,说明两个对象地址值也相等,当然hashcode()也就相等了;在String类中,equals()返回的是两个对象内容的比较,当两个对象内容相等时,Hashcode()方法根据String类的重写代码的分析,也可知道hashcode()返回结果也会相等。以此类推,可以知道Integer、Double等封装类中经过重写的equals()和hashcode()方法也同样适合于这个原则。当然没有经过重写的类,在继承了object类的equals()和hashcode()方法后,也会遵守这个原则。

equals方法其实比较的就是两个东西是否为同一个东西,这里要和==区分开来:

1、= =操作符既可以用于比较基本的数据类型,也可以用于比较对象,而equals只可以用于对象之间的比较
2、在比较String类型的对象时,= =操作符的原理只有两个变量是同一对象的引用时才会返回true,而equals方法只要两个变量的内容相同则返回true
3、其他类型的对象进行比较时,equals方法默认的原理是判断两者的内存地址是否相同,所以默认情况下与 = = 操作符返回的结果相同,但是这里应该发现差别,也就是equals方法可以被重写—用户可以定制自己的equals方法,而==操作符不能被重写

详细看我这篇文章
equals和 = =的区别

clone()

protected native Object clone() throws CloneNotSupportedException;

这个方法用来拷贝对象的,这里涉及了深拷贝和浅拷贝,详细内容可以参考我这篇文章

toString()

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

这个方法,没什么好讲的,看源码就知道了,也是我们用的最多。

notify()

 public final native void notify();

唤醒正在等待对象监视器的单个线程。 如果任何线程正在等待这个对象,其中一个被选择被唤醒。 选择是任意的,并且由实施的判断发生。 线程通过调用wait方法之一等待对象的监视器。

该方法只能由作为该对象的监视器的所有者的线程调用。 线程以三种方式之一成为对象监视器的所有者:

  1. 通过执行该对象的同步实例方法。
  2. 通过执行在对象上synchronized synchronized语句的正文。
  3. 对于类型为Class,的对象,通过执行该类的同步静态方法。

一次只能有一个线程可以拥有一个对象的显示器。

notifyAll()

public final native void notifyAll();

唤醒在该对象上等待的所有线程

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

        wait(timeout);
    }

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

导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。

timeout - 以毫秒为单位等待的最长时间。
nanos - 额外的时间,以纳秒范围0-999999。

finalize()

当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。 一个子类覆盖了处理系统资源或执行其他清理的finalize方法。
finalize的一般合同是,如果Java¢虚拟机已经确定不再有任何方法可以被任何尚未死亡的线程访问的方法被调用,除非是由于最后确定的其他对象或类的准备工作所采取的行动。 finalize方法可以采取任何行动,包括使此对象再次可用于其他线程; 然而, finalize的通常目的是在对象不可撤销地丢弃之前执行清除动作。 例如,表示输入/输出连接的对象的finalize方法可能会在对象被永久丢弃之前执行显式I / O事务来中断连接。

所述finalize类的方法Object执行任何特殊操作; 它只是返回正常。 Object的Object可以覆盖此定义。

Java编程语言不能保证哪个线程将为任何给定的对象调用finalize方法。 但是,确保调用finalize的线程在调用finalize时不会持有任何用户可见的同步锁。 如果finalize方法抛出未捕获的异常,则会忽略该异常,并终止该对象的定类。

在为对象调用finalize方法之后,在Java虚拟机再次确定不再有任何方式可以通过任何尚未被死亡的线程访问此对象的任何方法的情况下,将采取进一步的操作,包括可能的操作由准备完成的其他对象或类别,此时可以丢弃对象。

finalize方法从不被任何给定对象的Java虚拟机调用多次。

finalize方法抛出的任何异常都会导致该对象的终止被停止,否则被忽略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值