回 帖 发 新 帖 刷新版面

主题:[求助]java 不大理解equals方法的重写

一个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个回复)

沙发

这个方法应该是Name类里面的方法吧~~

这个方法的作用应该是比较Obj传进来的firstName,lastName是否与本对象的firstName,lastName相等。Obj强转成Name对象,是为了能与原来的Name对象进行比较。我没看全部类,只能猜测不知道是不是这样的:
    Name name1 = new Name();
    Name name2 = new Name();
    name1.equals(name2);
如果是这样,那么这个方法也就很容易理解了吧?

板凳

这涉及到类的向下转换。
该方法的形参是Object类型,所以需要首先判断传入的是否是Name实例,否则强制类型转换时(语句A)会抛出异常。

若没有语句A的强制转换,则语句B和C中的引用name.firstName和name.lastName将无从谈起,直接编译错误。

B和C调用的equals方法显然不是这里的方法,是String类的方法,作用就是判断两个字符串的内容是否相同。(我想firstName和lastName成员变量的类型应该为String吧)

3 楼

谢谢哈。第一个问题我还是想不通,能再讲详细吗?

既然obj是Name类的实例,那么他就一定是Name类的对象了,那何必要强制转换呢?(真的很不理解)

就比如说B是A的儿子,但却又要把B强制转换成A的儿子,这不多余么?


难道符合instance of Name 的obj有可能不一定是Name的对象,所以才要强制转换?

4 楼

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的儿子(强制类型转换不会抛出异常)。

我来回复

您尚未登录,请登录后再回复。点此登录或注册