Java的Object类详解

Java和C++都是面向对象的语言,但Java有关类的实现方式和C++有很大的不同,java中的所有类都存在一个根类,java中的所有类直接或间接继承java.lang.Object类;而C++中不存在这么一个根类(C++是多继承语言,Java是单继承语言)。下面我们对java中的Object类进行一个详细的分析,java中的所有类都具有下列方法,但不同的类可以重写相关方法的实现。

public final native Class<?> getClass();

该方法返回该对象的类对象,该类对象在类中有static synchronized修饰的方法被调用时会被加锁;该方法的实际返回类型是访问该方法的对象的类型或其子类型,如下所示:

Number n = 0;
Class<? extends Number> c = n.getClass();

public native int hashCode();

该方法返回该对象的哈希值;该方法在需要哈希表支持的类中会被使用(如HashMap),哈希值需要满足如下属性:

      1. 如果在同一个应用的运行过程中多次调用某个对象的该方法,其返回值应该保持一致;但在两个不同的运行实例中可以不同

      2. 如果两个对象通过equal方法验证是相等的,那么分别调用两个对象的hashCode方法,其返回结果必须一致

public boolean equals(Object obj);

该方法用于验证两个对象是否相等,不同的类可以有不同的实现方式,但无论如何需要满足如下三个属性:

     1. 自反性  x.equals(x) 永远返回true  (x非null)

     2. 对称性  x.equals(y) 和y.equals(x) 的结果永远相同 (x,y非null)

     3. 传递性  如果x.equals(y) 和y.equals(z) 都返回true,则x.equals(z)也返回true  (x,y,z非null)

     4. 一致性 连续两次调用x.equals(y)返回的结果应该相同(x,y非null)

     5. 对于任何非null的x, x.euqls(null)永远返回false

有关hashCode和equals,可以参见:http://blog.csdn.net/jiwang1990/article/details/39251325

protected native Object clone()throws CloneNotSupportedException;

该方法用于复制该对象的一个拷贝,当一个类实现了Cloneable接口时,Oject的clone方法返回该对象的逐域拷贝,否者抛出CloneNotSupportedException;所以clone不抛错时是一个浅度拷贝;要实现深度拷贝,必须要实现Cloneable接口并重写clone方法,而且该对象中的引用类型也必须这么做

有关如何实现深度拷贝,可以参见:http://blog.csdn.net/jiwang1990/article/details/39256723

public String toString();

格式化字符串输出该对象时的格式,如调用System.out.println(obj)方法时实际会调用obj.toString()

public final native void notify();
public final native void notifyAll();

该方法用于唤醒一个正在等待该对象监视器(monitor)的线程,如果有多个线程等待该监视器,那么将唤醒其中的任意一个。当线程需要等待对象的监视器时,可以通过调用wait方法实现。该方法只能被拥有该对象监视器的线程调用,一个线程可以通过以下几种方式获取对象监视器(object monitor):通过执行一个对象的synchronized方法;通过执行有synchronized包围起来的语句;对于类对象,通过执行类的synchronized static方法。该方法用于唤醒所有等待该对象监视器的线程,但最终还是只有一个能够获得锁。

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

调用 obj.wait() 的线程A会使A释放obj的对象监视器(对象锁),同时将线程A挂起到obj的等待队列中;既然要释放obj的监视器,首先必须要获取obj的监视器,所以obj.wait()必须被放置在 synchronized(obj) 块中。该线程会一直保持休眠状态,直到某个线程调用notify或notifyAll,或者其他线程中断(interrupt)了该线程。当线程在等待状态时被其他线程中断,将会产生InterruptedException,该异常会在锁被释放时抛出。 

自从java 1.5发布之后,已经不建议使用wait/notify,可以通过更加高级的并发工具代替,如Executor Framework, Concurrent Collection, Synchronizer

protected void finalize() throws Throwable { }

 该方法被垃圾收集器用于回收没有引用的对象,当JVM发现除了调用finalize方法,没有其他方式可以访问某个对象时,此时JVM会调用finalize方法执行一些操作,包括回收对象之前的清理操作,或者重新使该对象可访问;但是java虚拟机不保证finalize方法会完全被执行(例如finalize方法中包含一个while(true)循环,会导致回收线程死循环且无法回收垃圾对象)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值