主题:[求助]java 不大理解equals方法的重写
bow_lung
[专家分:0] 发布于 2008-02-28 18:33:00
一个Name类有firstName和lastName连个成员变量,该类重写的equals方法如下:
public boolean equals(Object obj) {
if(obj instanceof Name) {
Name name = (Name)Obj; // A
return(firstName.equals(name.firstName)) // B
&&(lastName.equals(name.lastName)); // C
}
return super.equals(obj);
}
1.A句中传进来的obj既然已经是Name的实例了,为什么还要强制转换成Name类的对象?这句话多余么?
2.B和C句调用的还是这里的equals方法么?
回复列表 (共4个回复)
沙发
寂寞の风 [专家分:130] 发布于 2008-02-28 20:15:00
这个方法应该是Name类里面的方法吧~~
这个方法的作用应该是比较Obj传进来的firstName,lastName是否与本对象的firstName,lastName相等。Obj强转成Name对象,是为了能与原来的Name对象进行比较。我没看全部类,只能猜测不知道是不是这样的:
Name name1 = new Name();
Name name2 = new Name();
name1.equals(name2);
如果是这样,那么这个方法也就很容易理解了吧?
板凳
billgacsli [专家分:1300] 发布于 2008-02-29 16:14:00
这涉及到类的向下转换。
该方法的形参是Object类型,所以需要首先判断传入的是否是Name实例,否则强制类型转换时(语句A)会抛出异常。
若没有语句A的强制转换,则语句B和C中的引用name.firstName和name.lastName将无从谈起,直接编译错误。
B和C调用的equals方法显然不是这里的方法,是String类的方法,作用就是判断两个字符串的内容是否相同。(我想firstName和lastName成员变量的类型应该为String吧)
3 楼
bow_lung [专家分:0] 发布于 2008-02-29 18:57:00
谢谢哈。第一个问题我还是想不通,能再讲详细吗?
既然obj是Name类的实例,那么他就一定是Name类的对象了,那何必要强制转换呢?(真的很不理解)
就比如说B是A的儿子,但却又要把B强制转换成A的儿子,这不多余么?
难道符合instance of Name 的obj有可能不一定是Name的对象,所以才要强制转换?
4 楼
billgacsli [专家分:1300] 发布于 2008-03-03 14:44:00
equals(Object obj)传入的只是Object类型,因此在实际调用中你可以传入任何对象实例。
obj instance of Name只是进行“是否是Name实例”判断,或者说白了就是判断“将obj强制类型转换是否会抛出异常”,也许这样你容易理解点。进行instance of判断后就保证了不会抛出异常,不用进行异常处理;若直接进行强制转换,则有可能抛出java.lang.ClassCastException异常,需要处理。也就是说可以写成如下代码:
public boolean equals(Object obj) {
try{
Name name = (Name)Obj; // A
return(firstName.equals(name.firstName)) // B
&&(lastName.equals(name.lastName)); // C
}catch(java.lang.ClassCastException cce){}
return super.equals(obj);
}
类比你举的例子,现在B有可能是A的儿子(注意只是有可能,传入的参数obj有可能是任意对象实例),那么在医学上需要进行DNA检验,若DNA检验匹配了(通过了instance of判断),才能确定B是A的儿子(强制类型转换不会抛出异常)。
我来回复