java中的Object类

来源:互联网 发布:windows图形界面原理 编辑:程序博客网 时间:2024/04/24 05:19

<span style="color: rgb(51, 51, 255); font-size: 18px; font-weight: bold; font-family: 微软雅黑; line-height: 21px; background-color: inherit;">概念:</span>
Java中所有类从根本上都是继承的Object类,即Object类是所有类的父类,是java中唯一没有父类的类。
Object中常用方法:

public boolean equals(Object obj)
比较当前对象与obj是否为同一对象,返回值:ture/false
public String toString()
返回当前对象的字符串表达形式
public native int hashCode()
返回对象的Hash码。Hash码是标志对象的唯一值,Hash码相同的对象是同一对象
protected void finalize()throws Throwable
对象销毁时被调用
以下三个方法应用于线程的调用中,都是native型方法,native型方法指由C++语言编写的方法,Java解释器对其进行转义后才执行
public final native void notify();
这是一个native方法,唤醒一个在当前对象监视器上等待的线程。 
被唤醒的线程直到当前线程释放锁后才可以执行,并且和其它线程竞争对象的拥有权(没有优先级之分)。 
这个方法应该仅仅被拥有对象监视器的线程所调用。 
一个线程成为对象的监视器的拥有者的三种方法: 
a. 执行该对象上的一个同步(synchronized)方法 
b. 执行一个同步在该对象上的代码块 
c. 执行该对象的类上的静态同步方法 
public final native void notifyAll();
与notify()方法类似,唤醒所有在当前对象监听器上等待的线程。
public final native void wait();

等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。

调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。


1.equals()方法

在Object类中equals()方法的定义如下:
public boolean equals(Object obj){ return (this == obj);}
Object类中的equals方法用于检测一个对象是否等于另一个对象,具体是比较两个对象是否具有相同的引用。这一点与“==”具有相同的功效。即是说,对于除开String对象的其他对象,equals与 == 具有一样的效果。
不同的类可以重载该方法,String类对Object类的equals()方法进行了重载,重载之后的equals()方法如下:
public boolean equals(Object anObject) {if (this == anObject) {    return true;}if (anObject instanceof String) {    String anotherString = (String)anObject;    int n = count;    if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {    if (v1[i++] != v2[j++])return false;}return true;    }}return false;    }


比较对象时,一般用equals()方法。先是判断两个对象是否是否有一样的引用,再判断两个String对象是否有相同的长度,接着比较每一个位置上的字符是否相同。比较实例如下:
void  EqualTest()    {     String s1 = new String("Hello");     String s2 = new String("Hello");     String s3 = "Hello";     String s4 = "Hello";     //未使用new,s4引用既存的对象(编译器创建对象之前先进行检测"Hello"是否已经存在,若存在,则返回原对象的引用)     System.out.println(s1.equals(s2));  //  true    x1行     System.out.println(s1 ==s2);   // false       两变量引用不同对象     System.out.println(s3.equals(s4)); //true   两变量引用相同对象     System.out.println(s3 ==s4);    // true        两变量引用相同对象    }


如果未重载equals()方法的类对象使用该方法与另一个对象进行比较,则调用Object的equals()方法,仍然是对象的比较,返回值为false。

2. hasCode方法

散列码(hash code)是由对象导出的一个整型值。散列码是没有规律的,如果x和y是两个不同的对象,那x.hashCode()与y.hashCode()一般是不相同的。
String类使用以下算法计算散列码:
<pre name="code" class="java">   public int hashCode() {   int h = hash;    if (h == 0) {   int off = offset;   char val[] = value;    int len = count;        for (int i = 0; i < len; i++) {    h = 31*h + val[off++];   }   hash = h;   }   return h;        }




即是说,String类的散列码是由内容导出的。如果两个String对象的内容相同,它们的散列码也相同。
而Object中,每个对象都有一个默认的散列码,其值为对象的存储地址。
equals若返回的是true,则对象的散列码必须一致。

3. toString方法

Object类定义了toString方法,打印输出对象所属的类名和散列码。
  
 public String toString() {   return getClass().getName() + "@" + Integer.toHexString(hashCode());    }

只要一个对象与一个字符串通过操作符“+”连接起来,Java编译就会自动的调用toString方法,以便获得这个对象的字符串描述。


0 0