来自竞考网(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
根据上面的简述,我们可以知道equals的重写格式了
public boolean equals(Object o){ Person p = (Person)o; return p.name.equals(this.name); }
所以A对了(要注意重写时返回值类型和参数列表及类型要保持一致)。
既然会重写equals了,那么就可以顺理成章的写出hashcode了
hashCode的原型
public native int hashCode()
是一个本地方法,实现是根据本地机器相关的。
通常重写hashCode()方法按以下设计原则实现。
(1)把某个非零素数,例如17,保存在int型变量result中。
(2)对于对象中每一个关键域f(指equals方法中考虑的每一个域)参照以下原则处理。
boolean型,计算(f?0:1)。
byte、char和short型,计算(int)f。
long型,计算(int)(f^(f>>32))。
float型,计算Float.floatToIntBits(f)。
double型,计算Double.doubleToLongBits(f)得到一个long,再执行long型的处理。
对象引用,递归调用它的hashCode()方法。
数组域,对其中的每个元素调用它的hashCode()方法。
(3)将上面计算得到的散列码保存到int型变量c,然后执行result = 37 * result + c。
(4)返回result。
这里的重写是
public int hashCode(){ return name.hashCode(); }
由于equals本身就是错的,所以BCD错了
如果答案错了,还请各位指正!!!