为了账号安全,请及时绑定邮箱和手机立即绑定

重写equals的代码中已经用getclass判断了两个对象的类型是否一样为什么还要再强制转换一次?

在重写equals的时候里面有这几行代码,

public boolean equals(Object obj) {

...

if (getClass() != obj.getClass())

return false;

HelloWorld other = (HelloWorld) obj;

...

}

这里已经用getclass判断了两个对象的类型是否一样为什么还要再强制转换一次?


正在回答

4 回答

你的问题逻辑有问题,if (A != B),那么你再写B = A是要赋值还是判断相等;相不相等是人为规定的一种状态,这状态是怎么样就怎么样,你没法通过比较两者改变这种状态。再有,B = A是赋值操作,B == A才是判断操作,然而 B == A只是单纯返回true 或 false,跟你一开始问的强制转换是没有关系的。计算机默认判断两个对象是否相等的方式是通过内存地址(这种默认当然也是人给计算机规定的),而重写equals方法就是改变这种计算机的默认判断方式,告诉计算,如果两个对象同属于一类,同时它们属性值相等,那么它们就是相等的。

0 回复 有任何疑惑可以回复我~
#1

一青 提问者

public static void main(String[] args) { Dog dog = new Dog(); Animal animal = new Dog(); System.out.println(dog.equals(animal)); } 大概懂了,我刚才自己这样试着敲了下,感觉应该是为了避免这种多态的情况,非常感谢你的回答:)
2016-08-05 回复 有任何疑惑可以回复我~
#2

ziom 回复 一青 提问者

挣你这3积分真是辛苦。。
2016-08-05 回复 有任何疑惑可以回复我~
#3

一青 提问者 回复 ziom

哈哈,可惜这个不能自己设置积分,不然肯定给你多一点
2016-08-05 回复 有任何疑惑可以回复我~

我也想到你说的这个问题,而且老师这个左侧菜单栏小于屏幕高度的话会出现掉下来的问题

0 回复 有任何疑惑可以回复我~

很多人类认为理所当然的事情,你如果不明确告诉计算机它就不会知道,比如有一个未知性别的人,我们可以这样判断:如果ta不是男人,那ta就是女人(这里不考虑人妖),但如果你只告诉计算机这个人不是男人,计算机是无法判断ta是女人的,计算机只是[单纯知道了这个人不是男人],你只有继续跟计算机明确说明这个人是女人才行。

0 回复 有任何疑惑可以回复我~
#1

一青 提问者

非常感谢你的回答,但是我还是有一点不清楚。相等和不相等是两个完全对立的情况,如果不是这个就肯定是另外一个。按你的说法,如果有两个变量A = 3,B = 3,用if(A != B)判断以后难道还要再写一步B = A才能让B和A相等吗?
2016-08-05 回复 有任何疑惑可以回复我~

他要达到的目的就是强转,只有强转以后才可以进行后续判断。

0 回复 有任何疑惑可以回复我~
#1

一青 提问者

还是没理解,假如是HelloWorld的对象A和某个对象B来比较,如果两个对象类型不同,那么直接就return false跳出了,如果相同的话,那么B就应该也是HelloWorld类型的对象,就应该不需要再强制转换了呀
2016-08-05 回复 有任何疑惑可以回复我~
#2

ziom 回复 一青 提问者

换个角度理解,你就算不经过 getClass() != obj.getClass() 这一步判断也可以进行强转,只不过是有可能转换失败而已,而经过了这一步判断则一定可以转换成功,所以强制转换是一定要你手动来写的,你不写的话程序只会傻傻的执行到那一步就不动了,程序只会根据代码的逻辑执行操作,他自己是不会有逻辑思维的。
2016-08-05 回复 有任何疑惑可以回复我~
#3

ziom 回复 一青 提问者

如果ta不是男人,那ta就是女人(这里不考虑人妖),但如果你告诉计算这个人不是男人,计算机是无法判断ta是女人的,计算机只是[单纯知道了这个人不是男人],你只有继续跟计算机明确说明这个人是女人才行。
2016-08-05 回复 有任何疑惑可以回复我~
#4

ziom 回复 ziom

靠,慕课网吃了我的回复。。。
2016-08-05 回复 有任何疑惑可以回复我~
查看1条回复

举报

0/150
提交
取消

重写equals的代码中已经用getclass判断了两个对象的类型是否一样为什么还要再强制转换一次?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信