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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓超军 中级黑马   /  2012-7-18 07:42  /  1483 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Person
  2. {
  3.         private String name;
  4.         private int age;
  5.         public boolean aquals(Object obj)
  6.         {
  7.                 if(this==obj) return true;
  8.                 if(obj==null) return false;
  9.                 if(this.getClass()!=obj.getClass()) //这里为什么不用instanceof进行比较呢?两者有什么区别?
  10.                         return false;            
  11.                 Person pObj=(Person)obj;
  12.                 return name.equals(pObj.name) && age==pObj.age;
  13.         }
  14. }
复制代码

4 个回复

倒序浏览
应该是this.getClass()!=obj.getClass 吧!

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
if(obj.getClass() != XXXClass.class) return false;
  用被比较对象的class对象和当前对象的class比较,看起来是没有问题,但是,如果这个类的子类没有重新实现equals方法,那么当子类.equals(子类)比较时,也就是要使用“if(obj.getClass() != XXXClass.class) return false;”来进行比较了,显然obj.getClass()《这个是字类》 肯定不等于XXXCalss.class《这个是父类》,从这里就直接返回得到false的结果了,因此子类中定义的equals实际上根本没发挥出应有的效力来,所以if(obj.getClass() != this.getClass()) return false;才是正确的比较。 呵呵,看到了没?我们首先否定了instanceof,接下来又否定了“obj.getClass() != XXXClass.class”这种错误的比较做法,最后才给出了正确的比较方法。
另外一个quick check是if(this==obj) return true;而且这个短路优化应该放在“obj.getClass() != XXXClass.class”优化的前面。


回复 使用道具 举报
instanceof操作符用于判断一个引用类型所引用的对象是否是一个类的实例
对于引用类型变量,Java 编译器只根据变量被先生声明的类去编译。
   instanceof 左边操作元被显式声明的类型与右边操作元必须是同种类或者有继承关系,即位于继承树的同一个继承分支上,否则编译出错
Object 类的 equals() 方法的比较规则为:当参数 obj 引用的对象与当前对象为同一个对象时,就返回true,否则返回false
在JDK中有一些类覆盖了 Object 类的equals()方法,它们的比较规则为:
  如果两个对象的类型一致,并且内容一致,则返回true。
这些类包括:java.io.File、java.util.Date、java.lang.String、包装类(如java.lang.Integer和java.lang.Double类)。
如果是自己定义的类的话,可以复写equals()方法,自己定义比较规则

Java语言对equals()的要求如下,这些要求是必须遵循的,以下几点也算是和instance of 的区别:
• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
• 反射性:x.equals(x)必须返回是“true”。
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张晨 于 2012-7-18 08:50 编辑

他想要比较的是字节码是否是同一份(完全一样才是true,其他都是false)
instanceof 比较两者是否是同一个类型 (子类 相对 父类 是同一类型,类实现了某接口也是同一类型)
有少许区别
回复 使用道具 举报
instanceof():判断的是一个对象是否属于某种类型
boolean result = obj instanceof class;

this.getClass()!=obj.getClass()) 这是在比较两份字节码,在内存中是相当于于"常量"

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马