Object类是所有类的父类。
在Object类中主要包括clone()、finalize()、equal()、toString()等方法。所有的类都可以重写Object类中的方法。
注意:Object类中的getClass()、notify()、notifyAll()、wait()等方法不能被重写,因为这些类被定义为final类型。
equal()方法
equals()方法的默认实现是使用“==”运算符比较两个对象的引用地址,而不是比较对象的内容,所以想要真正做到比较两个对象的内容,必须在自定义类中重写此方法。
在重写equals方法的同时,必须重写hashCode方法。
hascode()方法
hashcode方法返回该对象的哈希码值。此方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。
hashCode的存在主要是用于查找的快捷性,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
不同的对象可能会生成相同的hashcode值,所以不能根据hashcode值判断两个对象是否相等,但是可以直接根据hashcode值判断两个对象不等,如果两个对象的hashcode值不等,则必定是两个不同的对象。如果要判断两个对象是否真正相等,必须通过equals方法。
在重写equals方法的同时,必须重写hashCode方法。原因是:
以上的例子中,重写的equals方法中两个Person对象只要年龄相同就可以判定为同一个Person,而hashCode方法是将对象的存储地址进行映射。必须得让equals方法和hashCode方法始终在逻辑上保持一致性。
在程序执行期间,只要equals方法的比较操作用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。
getClass()方法
getClass()方法是Object类定义的方法,它会返回对象执行时的Class实例,然后使用此实例调用getName()方法可以取得类的名称。
可以将getClass()方法与toString()方法联合使用。
toString()方法
此方法的功能是将一个对象返回为字符串形式,它会返回一个String实例。在实际应用中通常重写toString方法,为对象提供一个特定的输出模式。
class Person
{
private int age;
Person(int age)
{
this.age=age;
}
public boolean compare(Person p)
{
return this.age==p.age;
}
/*复写,重写equals方法
一般都会覆盖此方法,根据对象的特有内容,建立判断对象是否相同的依据。
*/
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
{
throw new ClassCastException("类型错误");
}
Person p=(Person)obj;
return this.age==p.age;
}
public int hashCode()
{
return age;
}
}
class ObjectDemo
{
public static void main(String[] args)
{
Person p1=new Person(20);
Person p2=new Person(20);
Person p3=p1;
System.out.println(p1==p2);//false
System.out.println(p1.equals(p2));//false 也是比较地址
//复写后隐藏了子类的特性
System.out.println(p1.equals(p3));//true
System.out.println(Inter.toHexString(p1.hashCode()));
System.out.println(p1);//Person@61de33 默认调用了toString p1.toString
System.out.println(p1.getClass().getName()+"$"+Integer.Inter.toHexString(p1.hashCode());//Person$61de33
}
}
/*重写toString()方法*/
public class ObjectInstance{
public String toString(){
return "在"+getClass().getName()+"类中重写toString()方法";
}
public static void main(String[] args){
System.out.println(new ObjectInstance());
}
}