核心Object类_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 核心Object类

核心Object类

 2011/10/19 8:04:54  Tonyguxu  http://tonyguxu.iteye.com  我要评论(0)
  • 摘要:前言Object类是java中所有类的基类,而我们常常忽略这个类。该专题就是来研究Ojbect类中方法。方法如下:protectedObjectclone()booleanequals(Objectobj)StringtoString()inthashCode()protectedvoidfinalize()——见《JVM专题》Class<?>getClass()——见《类加载及反射专题》voidnotify()voidnotifyAll()voidwait()——见《多线程专题
  • 标签:
  • 前言

Object类是java中所有类的基类,而我们常常忽略这个类。该专题就是来研究Ojbect类中方法。方法如下:

protected ?Object clone()

boolean equals(Object obj)

String toString()

int hashCode()

protected ?void finalize() —— 见《JVM专题》

Class<?> getClass() ? ? ? ? ? ? ? ? ?—— 见《类加载及反射专题》

void notify()

void notifyAll()

void wait() ? ? ? ? ? ? ? ? ? ? ? —— 见《多线程专题》

void wait(long timeout)

void wait(long timeout, int nanos)

clone( )

克隆分为浅克隆和深克隆。浅克隆只复制一层,克隆的对象的引用不一样但是其中的属性引用一样的,而深克隆层层复制,为对象的属性重新申请内存空间。

Object中是浅克隆,Object 中没有定义克隆规范,规范在Cloneable接口中,所以只有实现Cloneable接口的类才能调用clone(),否则会抛出不支持克隆的异常java.lang.CloneNotSupportedException。

----示例代码见CoreJavaSamples项目

?

toString( )

public String toString()

1. 返回对象的字符串表示。该字符串是“自我描述”是一个简明且易于读懂的表示该对象状态的信息。

2. 建议子类重写该方法。

可按该格式重写:类名[属性1=值1,属性2=值2,..]

3. 默认返回 “类名@该对象哈希码的无符号十六进制”

getClass().getName() + '@' + Integer.toHexString(hashCode())

4. 对于Person p = new Person(),System.out.println(p)等效于

System.out.println(p.toString())。

下面操作也是ok的

String str = p + “”;同样等效于 String str = p.toString() + “”

?

getClass( )

返回此对象运行时类的Class对象。

----详见《类加载和反射》-----

?

hashCode( )

public int hashCode()

1.?返回对象的哈希码值。默认,按对象的地址计算

(与System.identityHashCode(Object x)计算结果相同)

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。?

如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。?

如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,程序员应该意识到,(推荐)为不相等的对象生成不同整数结果可以提高哈希表的性能。

2.?很多类重写Object类中的hashCode(),不根据地址来计算其值。

?

equals( )

1.?Object类中判断相等的标准是两个对象是否是同一个对象,即引用是否一样。

2.?子类通常需要重写该方法。

在java中,equals方法和hashCode()有连带关系,java对hashCode有规定:

equals为true的两个对象,hashCode必须相同,反之未必。

equals为false的两个对象,hashCode无所谓。

因此,重写equals必须重写hashCode,保持一致

?

【重写方式1】
@Override
public boolean equals(Object obj){
if(obj==null) return false;
else if(obj  instanceof  Student){
Student  stu = (Student)obj;
return this.id==stu.id;
}
return false;
}
@Override
public int hashCode(){
int type = 41;
return type*71+this.id;
}
【重写方式2】

@Override
public boolean equals(Object obj){
	if(obj==null) return false;
	else if(obj.getClass()  ==  this.getClass()){
	//注意obj.getClass获得是类型对象只有一个,可以直接使用==比较
		Student stu = (Student)obj;
		return stu.id == this.id;
	}
	return false;
}
@Override
public int hashCode(){
	int type = this.getClass().hashCode();
	return type*71+this.id;
}

?比较:(obj? instanceof? Student) ?VS ?(obj.getClass()? ==? this.getClass())

?

?

  • 扩展
    一. “冷藏”与“解冻”

?

?

  • 相关文章
发表评论
用户名: 匿名