来自竞考网(http://www.jingkao.net/)的2015年“甲骨文杯”全国Java程序设计大赛-赛前模拟
考察类的equals()和hashCode()的重写
何为重写?
(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
(3)子类函数的访问修饰权限不能少于父类的;
知道了重写的定义,接下来看看equals()方法的原型
public boolean equals(Object obj) { return (this == obj); }重写父类的equals方法时,需要按照以下几个规则设计:
1、自反性:对任意引用值X,x.equals(x)的返回值一定为true.
2、对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
3、传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
4、一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
5、非空性:任何非空的引用值X,x.equals(null)的返回值一定为false
public boolean equals(Object o){ Person p = (Person)o; return p.name.equals(this.name); }
既然会重写equals了,那么就可以顺理成章的写出hashcode了
hashCode的原型
public native int hashCode()是一个本地方法,实现是根据本地机器相关的。
通常重写hashCode()方法按以下设计原则实现。
public int hashCode(){ return name.hashCode(); }由于equals本身就是错的,所以BCD错了
如果答案错了,还请各位指正!!!