equals 不用写得那么复杂,只写这两行就行了。public boolean equals(Object other) {
        Card card = (Card) other;
        return card.CardNum == CardNum && card.CardPwd == CardPwd;
    }

解决方案 »

  1.   

    > 回复人:trumplet(检查) ( 一星(中级)) 信誉:104  2006-06-15 08:07:00  得分:0

    equals 不用写得那么复杂,只写这两行就行了。public boolean equals(Object other) {
    Card card = (Card) other;
    return card.CardNum == CardNum && card.CardPwd == CardPwd;
    }-----------------------------------------------------你的代码很有问题,很难想象你平时都这样写代码
    如果other不是Card的实例,就会抛出ClassCastException改写equals要遵守以下几个约定
    1.自反性。 x.equals(x) 一定为true
    2.对称性。当且仅当y.equals(x)返回true时,x.equals(y)也一定返回true
    3.传递性。对于人意的x,y,z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.quals(z)一定返回true
    4.一致性。对于任意的引用值x和y,如果用于equals比较的对象信息没有被修改的话,那么,多次调用x.equals(y)要么返回true, 要么返回false
    5.对于非空引用x, x.equals(null)一定返回false。
    绝对正确的应该是:
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;  // 仅仅为了效率
        }
        if (!(obj instanceof Card)) {
            return false;
        }
        Card other = (Card)obj;
        return cardNum == other.cardNum && cardPwd == other.cardPwd;
    }
      

  2.   

    你的程序出问题的关键在于判断cardNum,cardPwd用了==而不是equals()
    对于字符串来说,如果你的字符串是"abc"这种方式构造的,那么它们指向同一个地址,所以比较结果是相等,反之则不行。
    所以你最后应该写成
    return cardNum.equals( other.cardNum )&& cardPwd.equals(other.cardPwd);
      

  3.   

    to: leafxx(我是你装满回忆的盒饭,你的承诺)  
     
    呵呵,谢谢指教。说实在的,这样的活,我干得少,信口胡说罢了。不过,真正遇到实际问题的时候,可能也许大概差不多会考虑吧。
      

  4.   

    gogon是对的。
    关键是
    return card.CardNum == CardNum && card.CardPwd == CardPwd;这样写是不对的。
    ==的比较和equals的比较是不一样的。==比较的是是不是同一个对象;equals比较的是字符串的内容。
    例如下面的例子:
    String a="12345";
    String b = "";
    String c = "12345";
    b= b + '1';
    b= b + '2';
    b= b + '3';
    b= b + '4';
    b= b + '5';

    System.out.println(a == b);
    System.out.println( a.equals(b));
    System.out.println( a==c);
    System.out.println( a.equals(c));
    返回的结果是:false,true,true,true。
    如果你是要判断两个String的内容是否相等的话,还是应该用equals。
      

  5.   


    trumplet 的写法并没有什么不妥,因为抛出一个ClassCast异常往往有益于发现程序中的问题.
    因为我们一般不会去比较两个不同的类型,出现这种问题一般都是潜在的bug