重写equals方法新问题

rd828 2006-06-14 10:35:10
1)在使用200卡拨打电话时,如果已经输入了正确的卡号、密码,成功的登录到交换机并建立连接,则不需要再输入卡号、密码(例如在查询了电话卡中剩余金额后再拨打电话就不需要重新输入卡号、密码);如果没有建立连接,则需要输入卡号和密码。
2)根据200卡的这一特点,编写程序实现其余额查询功能。(其它情况在符合逻辑的前提下可以假设)
覆写object类的equals方法,实现比较信息的功能
import java.io.*;

public class Card {
private String CardNum;

private String CardPwd;

private int CardBalance;

private boolean isConnected;

public Card(String CardNum, String CardPwd, int CardBalance) {
this.CardNum = CardNum;
this.CardPwd = CardPwd;
this.CardBalance = CardBalance;
this.isConnected = false;

}

public Card(String CardNum, String CardPwd) {
this.CardNum = CardNum;
this.CardPwd = CardPwd;
this.CardBalance = 0;
this.isConnected = false;

}

public String getCardNum() {
return CardNum;
}

public String getCardPwd() {
return CardPwd;
}

public int getCardBalance() {
return CardBalance;
}

public void setisConnected(boolean isConnected) {
this.isConnected = isConnected;
}

public boolean equals(Object other) {
if (other == this) {
return true;
}
if (other == null) {
return false;
}
if (getClass() != other.getClass()) {
return false;
}
if (!(other instanceof Card)) {
return false;
}
Card card = (Card) other;
return card.CardNum == CardNum && card.CardPwd == CardPwd;
}
public int hashCode() {
return (CardNum.hashCode() + this.CardPwd.hashCode()) * 31;
}

public static void main(String args[]) throws IOException {

Card a = new Card("1000", "123456", 9999);
Card b = new Card("1001", "123456", 999);
Card c = new Card("1002", "123456", 99);

String num = "";
String password = "";
byte buffer[] = new byte[256];
byte buffer1[] = new byte[256];
while (!a.isConnected && !b.isConnected && !c.isConnected) {
System.out.print("Please enter your acount:");
int count = System.in.read(buffer);
for (int i = 0; i < count - 2; i++) {
num += (char) buffer[i];
}

System.out.print("Please enter your password:");
int count1 = System.in.read(buffer1);
for (int i = 0; i < count1 - 2; i++) {
password += (char) buffer1[i];
}
/*
* 下面写成Card temp = new Card(num, password);
* 所有判断都不通过
* 写成Card temp = new Card ("1000","123456")
* 就能通过
* 为什么
*/

Card temp = new Card(num, password);

if (a.equals(temp)) {
a.setisConnected(true);
System.out.println(a.getCardNum() + " have logined");
System.out.println("Your account's balance is"
+ a.getCardBalance());

} else if (b.equals(temp)) {
b.setisConnected(true);
System.out.println(b.getCardNum() + "Have logined");
System.out.println("Your account's balance is "
+ b.getCardBalance());

} else if (c.equals(temp)) {
c.setisConnected(true);
System.out.println(c.getCardNum() + "Have logined");
System.out.println("Your account's balance is"
+ c.getCardBalance());

}

}
}
}
...全文
246 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
treeroot 2006-06-15
  • 打赏
  • 举报
回复

trumplet 的写法并没有什么不妥,因为抛出一个ClassCast异常往往有益于发现程序中的问题.
因为我们一般不会去比较两个不同的类型,出现这种问题一般都是潜在的bug
码工码工 2006-06-15
  • 打赏
  • 举报
回复
1234565
afrag 2006-06-15
  • 打赏
  • 举报
回复
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。
oscar_java 2006-06-15
  • 打赏
  • 举报
回复
up
trumplet 2006-06-15
  • 打赏
  • 举报
回复
to: leafxx(我是你装满回忆的盒饭,你的承诺)

呵呵,谢谢指教。说实在的,这样的活,我干得少,信口胡说罢了。不过,真正遇到实际问题的时候,可能也许大概差不多会考虑吧。
gogon 2006-06-15
  • 打赏
  • 举报
回复
你的程序出问题的关键在于判断cardNum,cardPwd用了==而不是equals()
对于字符串来说,如果你的字符串是"abc"这种方式构造的,那么它们指向同一个地址,所以比较结果是相等,反之则不行。
所以你最后应该写成
return cardNum.equals( other.cardNum )&& cardPwd.equals(other.cardPwd);
leafxx 2006-06-15
  • 打赏
  • 举报
回复
> 回复人: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;
}
执假以为真 2006-06-15
  • 打赏
  • 举报
回复
帮你顶上去!都沉到底啦!
麦子_9 2006-06-15
  • 打赏
  • 举报
回复
幫你Up一下
trumplet 2006-06-15
  • 打赏
  • 举报
回复
equals 不用写得那么复杂,只写这两行就行了。

public boolean equals(Object other) {
Card card = (Card) other;
return card.CardNum == CardNum && card.CardPwd == CardPwd;
}
boydream 2006-06-14
  • 打赏
  • 举报
回复
关注一下
stevensinclair 2006-06-14
  • 打赏
  • 举报
回复
想知道?
rd828 2006-06-14
  • 打赏
  • 举报
回复
问题看代码中注释
hl8189 2006-06-14
  • 打赏
  • 举报
回复
怎么了,有问题吗?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧