JAVA Object 类简介

来源:互联网 发布:数据仓库与数据集市 编辑:程序博客网 时间:2024/05/17 06:28

1. 引言    

      众所周知,Java是一门面向对象的编程语言,在Java世界里,到处都是对象。作为Java开发人员对Object类可能并不陌生,在Java中,它是所有对象的基类,所有的其他对象都隐式的继承自Object类。

  下面基于JDK源码对Object类中的方法进行概括性介绍。

2. API简介

  在Eclipse中打开JDK源码,导航之Object类源码,则Object类中的方法图2-1所示:


 图 2-1  Object API 预览

2.1 Object()

该方法是Object 类的无参构造方法,该方法默认存在,但在JDK源码中我们看不到该方法的声明和具体实现。对于任何Java类,如果不显示的声明类的构造方法,则默认的会存在一个无参构造方法。

2.2 getClass()


该方法返回当前对象所属的类对象,类型为Class.

2.3 hashCode()


本地方法,由JVM负责实现。该方法用于返回一个整型数据,该整型数据代表了当前对象的哈希值

JDK中对Hash值的约定如下:

  • 相同的对象多次调用该方法时必须返回相同的值
    •  在不同的应用中调用该方法返回的哈希值不要求一定相同
  • 不同的对象返回的哈希值可以相同

如果子类没有重写 equals方法,则对象的相同依据内存地址是否相等来判断。如果重写了 equals方法,则依据equals方法来判断。为了保证

哈希的约定,重写 equals方法时也要重写 hashCode 方法。如果重写了 equals 方法,但没有重写 hashCode 方法,则会违反 “相同的对象具

有相等的哈希值” 这一约定。


PS. 关于哈希的深度解析将在后续博客中给出。


2.4 equals(Object obj)


该方法用于实现比较两个对象是否相等,如果相等,则返回true,如果对象不相等,则返回false。JDK对该方法提供了默认实现,从源码可以看出,默认情况下对象的是否相等是通过 “ ==” 进行判断的。因此,也就意味着,JDK默认比较两个对象是否相等是通过比较两个对象的内存地址

是否相同为判断依据。一般情况下,子类可能会重写equals()方法,以反映 "对象相等" 的真实语义。

ps. 重写equals()方法一般也要重写hashCode()方法。关于这两个方法更为详细的解读将在后续的博客中进行介绍。

2.5 clone()


该方法用于对象的克隆,返回对象的拷贝。如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。此方法执行的是该对象的“浅复制”。

2.6 toString()


toString()方法返回值为String类型,JDK对该方法提供了默认实现。依照JDK源码可知,该方法默认的返回 “对象的类名@十六进制表示的对象哈希值” 。

一般情况下,toString()方法应当返回当前对象的 “字符串表示”,返回值应该是人工可读的,且尽量能够表示对象本身。因此,JDK官方推荐子类重写该

方法,使其返回有意义的字符串。

2.7 notify()


唤醒在此对象监视器上等待的单个线程,如果有多个线程等待,则只会选择唤醒其中一个线程。该线程的选择是任意性的。

线程通过调用其中一个 wait 方法,在对象的监视器上等待。

直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。

此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:

  • 通过执行此对象的同步 (Sychronized) 实例方法。
  • 通过执行在此对象上进行同步的 synchronized 语句的正文。
  • 对于 Class 类型的对象,可以通过执行该类的同步静态方法。

一次只能有一个线程拥有对象的监视器。

2.8 notifyAll()


与notify()不同的是该方法唤醒在此对象监视器上等待的所有线程。

2.9 wait(long timeout)


导致当前的线程等待,直到其他线程调用此对象的 notify方法或notifyAll 方法,或者超过指定的时间量。当前的线程必须拥有此对象监视器。

2.10 wait(long timeout, int nanos)


此方法类似于一个参数的 wait 方法,但它允许更好地控制在放弃之前等待通知的时间量。用毫微秒度量的实际时间量可以通过以下公式计算出来:

1000000*timeout+nanos

2.11 wait()


参考2.9

2.12 finalize()


当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。

当 JVM已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。

Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。

在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。

对于任何给定对象,Java 虚拟机只调用一次 finalize 方法。


3. 总结

本片文章仅仅是对Object类的一些方法进行了简要介绍,所涉及的多个知识点并没有展开论述。关于多线程、对象克隆、哈希、finalize等知识点将在后续的博客中进行深入介绍




0 0
原创粉丝点击