今天看java.util.Comparator 这个接口,看到里面除了有个 int compare(T o1,T o2); 这个抽象方法外,还有 boolean equals(Object obj);这个抽象方法。
我看到的代码,都没有实现这个抽象方法,(包括自己写代码,也没有实现),程序也不报错,是否说明这个方法在实现这个接口的类的父类(Object)已经实现了?
假设是这样的话,那这个方法就不需要定义了,(因为接口都要由类实现,而所有的类都是Object的子类,那自然都继承了这个方法,当然可以重写。
如果不是这样的话,那它的意义究竟是什么呢?
可能说的不清楚,简单的说,既然Object类里有了的方法,为什么在接口里还要定义抽象方法?我猜这个定义这个方法的意义就在于让实现接口的程序员注意到上面这段注释。方便要求实现类中实现方法的复写,定义自己指定的toString(),equals(),hashcode()方法。 * Note that it is <i>always</i> safe <i>not</i> to override
* <tt>Object.equals(Object)</tt>. However, overriding this method may,
* in some cases, improve performance by allowing programs to determine
* that two distinct comparators impose the same order.这是为了在你的代码中对这两个方法进行重写(当你需要这样做时)。
比如我们在Hibernate中采用复合主键类时:
我们的Person类:
Person.java
@Entity
@Table(name="peroson_table")
public class Person
{
/*指定使用复合主键类是Name*/
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="first",column=@Column(name="person_first")),
@AttributeOverride(name="last",columen=@Column(name="person_last",length=20))
})
private Name name;
//普通属性
@Column(name="person_email")
private String email;
...Name属性的set和get方法
...Email属性的set和get方法
})
//Person的Name属性就是一个复合类型的标识属性}
那么在Name类中我们要实现java.io.Serializable接口并重写hashCod()和equals()方法:
Name.java
//修饰组件属性类
@Embeddable
Piblic class Name implements java.io.Serializable
{
Private String first;
Private String last;
//无参数的构造器
Public name()
{
}
//初始化全局属性的构造器
Public Name(String first,String laset)
{
This.first=first;
This.last=last;
}
...first属性的set、get方法
...last属性的set、get方法
//提供重写的equals方法
Public boolean equals(Object obj)
{
If(this==obj)
{
Return true;
}
If(obj.getClass()==Name.class)
{
Name target = (Name)obj;
If(target.getFirst().equals(first) && target.getLast().equals(last))是不是实现Comparator 接口的类中本来就有equels方法,所以一般不用再去实现它了!