黑马程序员技术交流社区

标题: 解读一个方法 [打印本页]

作者: 郭利超    时间: 2013-3-21 21:16
标题: 解读一个方法
本帖最后由 郭利超 于 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;

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

作者: 飞天小猪猪    时间: 2013-3-21 21:33
重写了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; // 比较名字和年龄是否相等。
作者: 我自信我很牛    时间: 2013-3-21 21:38
  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的父类。个人意见,仅供参考
复制代码

作者: 郭利超    时间: 2013-3-21 21:42
HM朱俊 发表于 2013-3-21 21:33
重写了Object类中的equals方法来判定Person类对象是否相等。 比如在Set集合中是不能存入相同元素的。假如这 ...

instanceof 到底是如何判定的? 主要就是这个有些蒙
作者: 郭利超    时间: 2013-3-21 21:43
烟磊磊 发表于 2013-3-21 21:38

磊哥 说道强转 到底格式有什么要求啊 任何都可以强转吗
作者: 彭颖    时间: 2013-3-21 21:44
本帖最后由 彭颖 于 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
作者: HM刘博    时间: 2013-3-21 21:45
   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是否相等,将所得布尔类型的值返回



      


作者: 我自信我很牛    时间: 2013-3-21 21:48
补充:刚才自己实际把这个方法补充完整才发现,其实这个就是个普通的重写equals,因为Object类提供的equals方法是比较对象地址,所以这个方法重写后,可以比较对象的属性了。。。。
作者: 飞天小猪猪    时间: 2013-3-21 21:51
郭利超 发表于 2013-3-21 21:42
instanceof 到底是如何判定的? 主要就是这个有些蒙

instanceof 是运算符,跟==、>、<一样,instanceof用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
boolean result = obj  instanceof  Person
如果Person是obj子类就返回true, 如果不是就返回false
作者: 我自信我很牛    时间: 2013-3-21 21:52
郭利超 发表于 2013-3-21 21:43
磊哥 说道强转 到底格式有什么要求啊 任何都可以强转吗

我认为其实强转的前提是,强转前提首先是要有继承关系。。个人见解
作者: 王_强    时间: 2013-3-21 21:52
楼主,首先你要明白: 在集合中,比如我们装了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:05
  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,则说明两个对象是同一个对象。这种写法基本上是用于集合中存储自定义对象时,判断元素对象是不是具有重复的
复制代码

作者: 郭利超    时间: 2013-3-21 22:06
嗯 感谢众神的版主!  理解了此小代码,
哎 技术分弄得自己惭愧啊   视频才看到第14天!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2