IOS 如何重写父类的 get 方法_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错了

如果答案错了,还请各位指正!!!