A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭利超 高级黑马   /  2013-3-21 21:16  /  1961 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭利超 于 2013-3-21 22:08 编辑

public boolean equals(Object obj)
{
  if(!(obj instanceof Person))
   return false;
  Person p = (Person)obj;
  
  return this.name.equals(p.name) && this.age == p.age;

这个方法啥意思啦? 哪个大神解读一下

12 个回复

倒序浏览
重写了Object类中的equals方法来判定Person类对象是否相等。 比如在Set集合中是不能存入相同元素的。假如这个集合里存入的是对象,那么就需要比较这个对象是否相等,就需要重写Object类中的equals方法,以比较Person类对象。

public boolean equals(Object obj)
{
  if(!(obj instanceof Person)) //这里判断参数是否是Person类对象 如果不是就返回错,是就继续下面的比较。
   return false;
  Person p = (Person)obj;
  
  return this.name.equals(p.name) && this.age == p.age; // 比较名字和年龄是否相等。
回复 使用道具 举报
  1. public boolean equals(Object obj)  //定义方法返回值类型为boolean,参数Object的对象
  2. {
  3.    if(!(obj instanceof Person))   // 判断obj对象不是类Perspon的的对象或者子类对象
  4.     return false;
  5.    Person p = (Person)obj;  //把对象obj强转为Person对象
  6.    
  7.    return this.name.equals(p.name) && this.age == p.age;//强转后的对象属性变成子类对象属性
  8.     // 我认为这个方法主要是验证了父类强转为子类后属性值也相应为子类的属性值,判断主要确定obj不是Person的对象也不是其子类对象,
  9.         //而可以强转就是Person的父类。个人意见,仅供参考
复制代码
回复 使用道具 举报
HM朱俊 发表于 2013-3-21 21:33
重写了Object类中的equals方法来判定Person类对象是否相等。 比如在Set集合中是不能存入相同元素的。假如这 ...

instanceof 到底是如何判定的? 主要就是这个有些蒙
回复 使用道具 举报
烟磊磊 发表于 2013-3-21 21:38

磊哥 说道强转 到底格式有什么要求啊 任何都可以强转吗
回复 使用道具 举报
本帖最后由 彭颖 于 2013-3-21 21:46 编辑

这是重写的equals方法

一般定义的类的equals和tostring方法都要重写一下
  1. f(!(obj instanceof Person))
复制代码
if判断的是obj是否是和person一样的实例
  1. return this.name.equals(p.name) && this.age == p.age;
复制代码
最后的return是equals了名字返回名字和年龄的true或者false
回复 使用道具 举报
   java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
result = obj instanceof Person
如果 obj  是 Person 的一个实例,则 instanceof 运算符返回 true。如果 obj  不是指定类的一个实例,或者 obj  是 null,则返回 false。
所以 if(!(obj instanceof Person))
         return false;//意思是如果obj不是Person的一个实例,就返回false。


Person p = (Person)obj;//将obj强转为Person类型

return this.name.equals(p.name) && this.age == p.age;
判断当前对象的name和obj的name是否相同并与上当前对象的age和obj的age是否相等,将所得布尔类型的值返回



      

回复 使用道具 举报
补充:刚才自己实际把这个方法补充完整才发现,其实这个就是个普通的重写equals,因为Object类提供的equals方法是比较对象地址,所以这个方法重写后,可以比较对象的属性了。。。。
回复 使用道具 举报
郭利超 发表于 2013-3-21 21:42
instanceof 到底是如何判定的? 主要就是这个有些蒙

instanceof 是运算符,跟==、>、<一样,instanceof用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
boolean result = obj  instanceof  Person
如果Person是obj子类就返回true, 如果不是就返回false

点评

感谢!  发表于 2013-3-21 22:06
回复 使用道具 举报
郭利超 发表于 2013-3-21 21:43
磊哥 说道强转 到底格式有什么要求啊 任何都可以强转吗

我认为其实强转的前提是,强转前提首先是要有继承关系。。个人见解

点评

感激!  发表于 2013-3-21 22:07
回复 使用道具 举报
楼主,首先你要明白: 在集合中,比如我们装了N个元素person,其中属性为name和age,那么现在你要排序?(把Person类排序)


public boolean equals(Object obj)  //Object是所有类的父类,根据多态,父类可以指向之类(Object->Person,下转型,是自动的)
{
   if(!(obj instanceof Person))   // 判断obj对象不是类Perspon的的对象或者子类对象
    return false;
   Person p = (Person)obj;  //把对象obj强转为Person对象
   
   return this.name.equals(p.name) && this.age == p.age;  //这也是多态,是上转型,要强制转换,然后比较大小
}
楼主,这是我对你的代码的理解,希望对你有用,还补充一点:
像比较自定义的类的时候,一般可以通过重写 equal()方法来实现,你的就是这种情况!

点评

感恩!  发表于 2013-3-21 22:07
回复 使用道具 举报
  1. public boolean equals(Object obj)          //这里重写了Object类的equals方法
  2. {
  3.   if(!(obj instanceof Person))                          //这里其实就是多态思想,在父类引用指向子类对象时,向下转型前先判断这个父类是不是属于这个子类的。
  4.    return false;                                             //这里如果obj不属于Person类,就返回false
  5.   Person p = (Person)obj;                             //否则obj即属于Person类,所以强制转型
  6.   
  7.   return this.name.equals(p.name) && this.age == p.age;         //这里其实就是通过判断对象的name和age属性是不是都一样的,如果两者均为true,返回true,则说明两个对象是同一个对象。这种写法基本上是用于集合中存储自定义对象时,判断元素对象是不是具有重复的
复制代码
回复 使用道具 举报
嗯 感谢众神的版主!  理解了此小代码,
哎 技术分弄得自己惭愧啊   视频才看到第14天!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马