java中的Object类

<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方法,以便获得这个对象的字符串描述。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值