Object类的方法实例讲解

时间:2018-08-06
本文章向大家介绍Object类的方法实例讲解,需要的朋友可以参考一下。

在java中,Object类是所有类的超类,所有的类都继承Object类中的方法。

Object类中有12个成员方法,并没有显示声明任何构造方法,而是存在着默认的无参的构造函数。

Object类源代码分析:

 1   package java.lang;
 2   
 3   public class Object {
 4     //一个本地方法,具体是用C(C++)在DLL中实现的
 5       private static native void registerNatives();
 6       static {
 7           registerNatives();
 8       }
 9     //返回该Object的运行时类
10       public final native Class<?> getClass();
11    /*
12     对于Object对象来说,返回对象的地址值。但一般在其他类中都会    
13         重写hashCode方法,使其通过计算得到一个int值(hash值)重写
14         hashcode方法时必须遵循以下几点:
15     1、在Java应用的同一次执行过程中,同一对象被多次调用,则他们的
16         hashcode值必然相同。而对于同一个应用的两次不同的调用,它们的
17         hashcode值可以相同,也有可能不同。
18     2、对于两个对象来说,如果他们的equals方法比较返回true,那么这
19         两个对象的hashcode必然相同。这也解释了为什么String类中,如果
20         两个对象的equals方法相同,则他们的hashcode值一定相同。
21     3、对于两个对象来说,如果使用equals方法返回为false,则他们的
22         hashcode的值有可能相等也可能不等,(如果不同会提高性能,因为
23         在集合中类判断两个对象是否相等,如果其hashcode不等就直接不用
24         判断equals方法了)
25     4、对于Object对象来说,不同的Object对象的hashcode是不同的,
26         它们返回的是对象的地址,equals返回的也是对象的地址。所以在自
27         己定义的类中如果要添加到集合对象中,最好是要重写hashcode和
28         equals方法,不然会自动继承自Object类中的两个方法根据对象地址
29         来判断。在重写自己定义的类时,通常是在类中的根据某个值如
30         name.hashcode();来进行判断。
31    */
32       public native int hashCode();
33     //Object类中equals方法是比较两个对象的地址是否相同,而一般我们
34       认为两个对象中只要属性相同,这两个对象就相同。所以一般其他类都 
35       会重写equals方法
36       public boolean equals(Object obj) {
37           return (this == obj);
38       }
39     //用来另存一个当前存在的对象
40       protected native Object clone() throws      
41       CloneNotSupportedException;
42    //返回一个字符串,用来标识自己
43       public String toString() {
44           return getClass().getName() + "@" + 
45           Integer.toHexString(hashCode());
46       }
47    //唤醒在此对象监视器上等待的单个线程。如果有多个线程等待,则随
48        机唤醒一个
49       public final native void notify();
50     //唤醒在此对象监视器上等待的所有线程
51       public final native void notifyAll();
52     //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超
53       过指定的时间量前,导致当前线程等待
54       public final native void wait(long timeout) throws 
55       InterruptedException;
56    /*
57   在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他
58       某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程
59       等待
60   */
61       public final void wait(long timeout, int nanos) throws 
62       InterruptedException {
63           if (timeout < 0) {
64               throw new IllegalArgumentException("timeout value is 
65               negative");
66           }
67   
68           if (nanos < 0 || nanos > 999999) {
69               throw new IllegalArgumentException(
70                                   "nanosecond timeout value out of range");
71           }
72   
73           if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
74               timeout++;
75           }
76   
77           wait(timeout);
78       }
79     /*
80         在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当 
81         前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用 
82         一样。   
83        当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等 
84        待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对
85        象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的
86        所有权后才能继续执行。
87        */
88       public final void wait() throws InterruptedException {
89           wait(0);
90       }
91     //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收
92       器调用此方法
93       protected void finalize() throws Throwable { }
94   }    

通过Object类源码可以看到一些方法用native修饰,使用native修饰符修饰的方法需要非java语言来实现,比如C,C++。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。

在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。