关于重写equals方法

shirui8653719 2013-08-11 03:31:49
public class User {
int id;
String email;
String pwd;
public User(){}
public User(int id, String email, String pwd){
super();
this.id = id;
this.email = email;
this.pwd = pwd;
}
public String toString() { return id + "," + email;}
public boolean equals(Object obj) {
if(obj == null) {
return false;
}
if(this == obj)
return true;
if(obj instanceof User) {
User o = (User) obj;
return id == o.id;
}
return false;
}
public int hashCode() { return id;}
}

我对上面的代码有两个疑问:第一,在第7行,是不是一定要调用super()函数,不调用可以吗? 第二,在第19行到22行,代码是什么意思,没理解,谁能讲解一下。谢谢大家啦。。。
...全文
378 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
shirui8653719 2013-08-15
  • 打赏
  • 举报
回复
引用 17 楼 htb666 的回复:
是达内的学生吗?
是啊,怎么啦,呵呵。
htb666 2013-08-15
  • 打赏
  • 举报
回复
是达内的学生吗?
owen1759 2013-08-14
  • 打赏
  • 举报
回复
引用 14 楼 huntor 的回复:
[quote=引用 13 楼 owen1759 的回复:] 就是说比如我有个SpecialUser类继承自User类 那么我有个此类的对象su1,其su1.id=123 并且我有个User类的对象u1,其u1.id=123 它们是否equals呢? 我首先应该判断su1是否是User类的,因为SpecialUser是User子类,所以为true 然后将su1转型成为User型,判断他们的id是否相等
u1.equals(su1) 和 su1.equasls(u1) 能同时为true 或 false吗?[/quote] 只要子类在继承时没有覆盖equals()方法,这样的判断绝对是互等的 前面我不是讲了u1.equals(su1)的情形么? 而su1.equasls(u1)的情形就更简单了,u1当然也是User类的,把它cast成User类等于什么也没有做 然后,判断su1.id=u1.id,结论还是一样的
zzy1355179 2013-08-14
  • 打赏
  • 举报
回复
不用equals也是可以的 public boolean equals(Object obj) { if(obj!=null){ if(obj instanceof User){ User 0=(User) obj ; if(this.id=o.id&&this.email equalse(o.email)&&this.pwd){ retrn true ; } } } return false ; } 第二行先是判断obj是不是为空(不存在),如果是直接返回false 第三行判断obj是不是一种类型的如果是就把他强制转化成User类型 if(this.id=o.id&&this.email equalse(o.email)&&this.pwd) 判断类里面的属性是不是相等 注意if的作用域
huntor 2013-08-14
  • 打赏
  • 举报
回复
引用 13 楼 owen1759 的回复:
就是说比如我有个SpecialUser类继承自User类 那么我有个此类的对象su1,其su1.id=123 并且我有个User类的对象u1,其u1.id=123 它们是否equals呢? 我首先应该判断su1是否是User类的,因为SpecialUser是User子类,所以为true 然后将su1转型成为User型,判断他们的id是否相等
u1.equals(su1) 和 su1.equasls(u1) 能同时为true 或 false吗?
owen1759 2013-08-14
  • 打赏
  • 举报
回复
就是说比如我有个SpecialUser类继承自User类 那么我有个此类的对象su1,其su1.id=123 并且我有个User类的对象u1,其u1.id=123 它们是否equals呢? 我首先应该判断su1是否是User类的,因为SpecialUser是User子类,所以为true 然后将su1转型成为User型,判断他们的id是否相等
一颗米粒 2013-08-12
  • 打赏
  • 举报
回复
1,一切类都是Object的子类,这里不写super()是可以的,但是也不写他也是存在的 2,在重写equals的时候,要比较就应该确定是否属于同一类型的事物,所以要用到instanceof来判断下
raistlic 2013-08-12
  • 打赏
  • 举报
回复
引用 6 楼 huntor 的回复:
if(obj instanceof User) { ==> if(obj.getClass() == User.class) {

  if( obj instanceof User )

==>
  
  if( obj != null && User.class.isInstance(obj) )
raistlic 2013-08-12
  • 打赏
  • 举报
回复
引用 10 楼 huntor 的回复:
[quote=引用 7 楼 raistlic 的回复:]

  if( obj instanceof User )

==>
  
  if( obj != null && User.class.isInstance(obj) )
isInstance 方法和 instanceof 等价。 非空判断在equals方法开头就做过了。[/quote] 额,我可能误解了你那个 ==> 的意思……
huntor 2013-08-12
  • 打赏
  • 举报
回复
引用 7 楼 raistlic 的回复:

  if( obj instanceof User )

==>
  
  if( obj != null && User.class.isInstance(obj) )
isInstance 方法和 instanceof 等价。 非空判断在equals方法开头就做过了。
huntor 2013-08-11
  • 打赏
  • 举报
回复
if(obj instanceof User) { ==> if(obj.getClass() == User.class) {
YY-java 2013-08-11
  • 打赏
  • 举报
回复
可以 因为上面有个无参的构造方法; 那是用instanceof判断有obj你要传入的对象是否是User类的类型的 后面的是强制类型的转换 因为你要当前类下的属性什么的
末日哥 2013-08-11
  • 打赏
  • 举报
回复
引用 3 楼 fudongrifdr 的回复:
[quote=引用 1 楼 Candylibin 的回复:] 1,不调super()是可以的,这本来就是一个隐式的调用,你不自己写 java也会帮你调一次父类的构造函数。 2,instanceof 是判断是否包含 ** 对象的,User o = (User) obj; 这句话是多态的体现,向下类型转换
向上转型吧[/quote] 哦,向下
末日哥 2013-08-11
  • 打赏
  • 举报
回复
引用 1 楼 Candylibin 的回复:
1,不调super()是可以的,这本来就是一个隐式的调用,你不自己写 java也会帮你调一次父类的构造函数。 2,instanceof 是判断是否包含 ** 对象的,User o = (User) obj; 这句话是多态的体现,向下类型转换
向上转型吧
末日哥 2013-08-11
  • 打赏
  • 举报
回复
可以 判断obj 是不是User的实例,是就把obj转型成User类型,返回他的id
Candylibin 2013-08-11
  • 打赏
  • 举报
回复
1,不调super()是可以的,这本来就是一个隐式的调用,你不自己写 java也会帮你调一次父类的构造函数。 2,instanceof 是判断是否包含 ** 对象的,User o = (User) obj; 这句话是多态的体现,向下类型转换

62,616

社区成员

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

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