首先声明下,程序的例子是用的面试宝典上,但是解析的内容是原创的。
重写的函数必须有相同的函数名,一致的参数列表和返回值,访问权限可以不一样,但是不能比被重写的函
数更严格(即被重写的是protected的话,重写的函数只能是public或者protected),最后,还需要注意的
重写方法需要抛出与原方法所抛出异常类型一致的异常或者不抛出异常。
具体示例:
import java.util.ArrayList;
import java.util.List;
public class Test7 {
private String value = null;
public Test7(String v) {
value = v;
}
public boolean equals(Test7 o) {
if (o == this) {
return true;
}
if (o instanceof Test7) {
Test7 test7 = (Test7) o;
return value.equals(test7.value);
}
return false;
}
/*public boolean equals(Object obj) {这样才是改写,参数必须与Object方法中一样是Object类
型才对
return true;
}*/
public static void main(String[] args) {
List list = new ArrayList();
Test7 test1 = new Test7("object");
Test7 test2 = new Test7("object");
Test7 test3 = new Test7("object");
Object test4 = new Test7("object");
list.add(test1);
System.out.println(list.contains(test2));//false
System.out.println(test2.equals(test3)); //true
System.out.println(test3.equals(test4)); //false
System.out.println(test4.equals(test3)); //false
}
}
解析:第一个输出为false,是因为list.add(test1);在list中放入的是test1,也就是“object”内存地址
,而不是“object”本身,所以输出肯定为假;也就是list中contains方法判断的依据是地址;
第二个输出true,是因为test2调用的是Test7的equals方法,符合第二个if条件,最后比较是String
的equals方法,String重写了equals方法自然比较的是值,所以输出为true;
第三个输出为false,是因为test3调用的是Object的equals方法,可能很多人会奇怪为什么不是Test7
的,因为test3.equals(test4),其中test4是Object类型,而这个Test7中的是Test7类型,所以肯定优先匹
配的是父类Object中equals方法,因为Object中的equals方法的参数是Object类型的,所以调用了Object中
equals方法,自然比较的是地址,那么输出也肯定为false了;
第四个输出为false,是因为test4调用的也是Object的equals方法,可能又有很多人会奇怪:这不是
多态吗,为什么不是Test7的equals方法,因为这个equals方法根本不是重写,重写必须要有一致的参数列表
,这里的equals的参数类型是Test7,而Object中的Object类型,所以不是重写,那么自然没有多态存在,调
用的就是Object的equals方法,比较的是地址,所以输出为false了。