equals的问题 看博文没有看懂 10C

例如:假设Dog扩展了Aminal类。

dog instanceof Animal 得到true

animal instanceof Dog 得到false

这就会导致

animal.equls(dog) 返回true
dog.equals(animal) 返回false

  1. animal 和 dog 是类 ,也能比较? 比较的是它们当中的对象?
  2. 为什么会导致不同的返回结果呢? 也就是true和false, 本来我认为equals比较的是像String类型一样的东西。而animal和dog之间是父类和子类之间的关系,居然也能对比,而且还能对比出来false和true,这是为什么呢?

10个回答

楼主,先说下关于equals的比较,如你上面所示,dog与annimal比较和annimal与dog进行比较 如果在不重写哈西地址的情况 绝对不可能返回true的,要说明的一点就是equals比较的其实就是对象的内存地址,如果你创建了dog和annimal这2个类并且重写了equals这个方法,并且返回相同的值,那么你把这个对象比较才会返回真,如果不重写的话则jvm会在创建这2个对象自己对他们分配地址值的,并且不会出现重复,所以比较的结果肯定也是假

1>instanceof 判断左边的表达式是否是右边的表达式的实例。这个有问题不?如果是就返回true.
就是说,继承这个技术,一个子类再创建对象的时候会先创建父类的对象,生成的子类对象会包在父类对象外面。
你看一下子类的构造方法嘛,public dog(){
super();
//这句话就是创建父类对象,一般默认不写。所以看不到,但是确实存在
}

kbc_kbc
kbc_kbc 所以equals方法可以有任意的实现方式,随便你比较什么,只要你在类里面重写,重写成什么功能就是什么功能,没重写就是默认调用Object类的equals,它就只能比较对象地址了
大约 3 年之前 回复
kbc_kbc
kbc_kbc 再说equals方法,你认为是比较字符串,是这样的。但之所能比较字符串是String类有重写过equals方法。不信你ctrl,点击String那个名字。源码上写的很清楚,
大约 3 年之前 回复
kbc_kbc
kbc_kbc animal instanceof Dog 现在看这句话有什么问题?父类的对象是子类的实例?肯定不对啊,因为有一些属性父类没有啊,怎么相等
大约 3 年之前 回复
kbc_kbc
kbc_kbc 所以父类的所有属性子类都拥有了, 除了私有属性不能直接访问,其它都能直接访问
大约 3 年之前 回复
kbc_kbc
kbc_kbc 虽然说的不是很正确,但子类创建对象会调用父类构造方法是没错的
大约 3 年之前 回复

equals比较的是对象的内容是否相同,显然,animal有的dog也有,但dog有的animal不一定有,所以就是true和false两种结果。
你说的string用equals比较本质上就是比较两个字符串的内容是否一直,而不在乎是否是用一个对象,能理解吗?

ShewMi
Imadone 回复Pfeffer: 对了,你也可以去了解下“里氏代换原则”,可以帮助你理解。
大约 3 年之前 回复
ShewMi
Imadone 回复Pfeffer: 这个比较是有个方向性的,animal被dog包含-->true dog不能被animal包含-->false,子父类的比较只是一种特殊情况,java中有这么个优先级,如果你dog和cat比较,那么结果怎样都是false吧。
大约 3 年之前 回复
Pfeffer
Pfeffer 但是dog在某种程度上是包含animal的呀,这就是我不懂的地方
大约 3 年之前 回复

(1)
dog instanceof Animal 得到true
animal instanceof Dog 得到false
这两句用的是 instanceof 关键字,,判断对象是,某个类的实例,dog和animal都是对象
这个为什么返回这样的结果,,其实是“里氏代换原则”(大概意思是:子类出现的地方父类都可以)

/**  
* instanceof运算符用法  
* 运算符是双目运算符,左面的操作元是一个对象,右面是一个类.当  
* 左面的对象是右面的类创建的对象时,该运算符运算的结果是true,否则是false  
*   
* 说明:(1)一个类的实例包括本身的实例,以及所有直接或间接子类的实例  
* (2)instanceof左边操作元显式声明的类型与右边操作元必须是同种类或右边是左边父类的继承关系,  
* (3)不同的继承关系下,编译出错  
*/    出自:http://blog.csdn.net/cnmilan/article/details/41696093

(2)

 animal.equls(dog) 返回true
dog.equals(animal) 返回false

equls()是对象的方法,,,类可以调用??不应该吧,,,类直接可以调用静态方法
上面这两句,,我感觉有点问题,,

equals性质:
 自反性:  x.equals(x) 一定是true

对null:  x.equals(null) 一定是false

对称性:  x.equals(y)  和  y.equals(x)结果一致

传递性:  a 和 b equals , b 和 c  equals,那么 a 和 c也一定equals。

一致性:  在某个运行时期间,2个对象的状态的改变不会不影响equals的决策结果,那么,在这个运行时期间,无论调用多少次equals,都返回相同的结果。
参考链接:http://www.cnblogs.com/lulipro/p/5628750.html
Small_Mouse0
鼠小 对称性: x.equals(y) 和 y.equals(x) 结果一致,,,,
大约 3 年之前 回复
Pfeffer
Pfeffer instanceof 其实拆分开就是instance of ,dog 肯定是动物啊,这个我能理解,关键是下面那个,你确定是错的?
大约 3 年之前 回复

1、instanceof 表示的是类型判断,如果判断的类型是父类,或者是实现的接口都会返回true。
但是父类不能instanceof 子类,因为这个判断只向上兼容,也就是说dog是animal,但是animal不是dog。

2、所有的对象都会有equals方法,除了String以外,其他的一般都是判断内存是否相等,可以通过重写equals方法实现自定义的equals。

在补充截图给你看下 不重写的情况 :
图片说明
图片说明
图片说明
以上是默认的情况
下面是修改了对象的hashcode和equals方法之后的执行结果:
图片说明
图片说明
图片说明

题主提问应该带上代码,你的现象肯定是代码自身造成的
论坛回复较为混乱,题主选择性的辩证吸收就好
申明一点,Java的比较都是类的比较

不考虑方法重写的情况(因为没有代码), 问题关键是应该是变量引用的问题,还请题主补充一下内容

建议看看Object.equery()

第一:instanceof 和equals绝对不可以等同而论,二者根本就没有什么关系,instanceof 是判断类的类型的,即是否是某类的实例,子类是父类的实例
可见多态性,第二:“animal.equls(dog) 返回true”这个结论我不知道你是怎么得出的,默认的equals即Object的equals方法比较的是引用是否指向同一个
地址单元,很明显animal和dog是两个对象,怎么可能一个引用同时指向这两个对象呢,所以不可能返回true,另外我怀疑楼主呗String的equals方法给误导了
建议去看下源码,String中重写了Object中的equals,比较的是内容而不仅仅是内存

instanceof关键字
语法:对象 instanceof 数据类型
作用:判断这个对象是否是后面指定的类型
注意:instanceof只应用于引用数据类型

equals:比较的是内容

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐