例如:假设Dog扩展了Aminal类。
dog instanceof Animal 得到true
animal instanceof Dog 得到false
这就会导致
animal.equls(dog) 返回true
dog.equals(animal) 返回false
equals比较的是对象的内容是否相同,显然,animal有的dog也有,但dog有的animal不一定有,所以就是true和false两种结果。
你说的string用equals比较本质上就是比较两个字符串的内容是否一直,而不在乎是否是用一个对象,能理解吗?
(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
楼主,先说下关于equals的比较,如你上面所示,dog与annimal比较和annimal与dog进行比较 如果在不重写哈西地址的情况 绝对不可能返回true的,要说明的一点就是equals比较的其实就是对象的内存地址,如果你创建了dog和annimal这2个类并且重写了equals这个方法,并且返回相同的值,那么你把这个对象比较才会返回真,如果不重写的话则jvm会在创建这2个对象自己对他们分配地址值的,并且不会出现重复,所以比较的结果肯定也是假
1、instanceof 表示的是类型判断,如果判断的类型是父类,或者是实现的接口都会返回true。
但是父类不能instanceof 子类,因为这个判断只向上兼容,也就是说dog是animal,但是animal不是dog。
2、所有的对象都会有equals方法,除了String以外,其他的一般都是判断内存是否相等,可以通过重写equals方法实现自定义的equals。
在补充截图给你看下 不重写的情况 :
以上是默认的情况
下面是修改了对象的hashcode和equals方法之后的执行结果:
1>instanceof 判断左边的表达式是否是右边的表达式的实例。这个有问题不?如果是就返回true.
就是说,继承这个技术,一个子类再创建对象的时候会先创建父类的对象,生成的子类对象会包在父类对象外面。
你看一下子类的构造方法嘛,public dog(){
super();
//这句话就是创建父类对象,一般默认不写。所以看不到,但是确实存在
}
题主提问应该带上代码,你的现象肯定是代码自身造成的
论坛回复较为混乱,题主选择性的辩证吸收就好
申明一点,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:比较的是内容