equals 方法 Java 核心技术卷一

图片说明

所有的问题都在图片中,求解答

7个回答

对于两个对象是否“相等”, 我们有两种比较。
1>this==otherobject
如果两个对象用“==”来比较,那就是比较对象的引用(引用呢,就是存放在栈区的一个变量。它的值就是对象的地址。而对象真正是放在堆区的,你要使用它就找它的引用就好啦(也就是那一串地址))
每一个new出来对象都分配不同的堆空间,所以引用就不一样。
反之用“==”来比较,就是比较这两个对象在堆空间是不是一个地址。如果一样,那肯定是一样喽
2>就是这个equals()方法用来比较具体的对象的属性。因为两个地址不同的对象,虽然地址不同 但是可能属性一样,

Pfeffer
Pfeffer 请您看一下我在评论中插入的图片。
接近 3 年之前 回复

你好,从你提的问题可以看出你应该刚学java没多久,其实这很好理解。
分别解答你的3个问题:
1、getclass() 调用和你想的一样,是省略了this,方法调用时不写默认是调用本身对象的方法。
2、equals 是判断两个对象是否相等。而不是判断地址是否相等。
3、this==otherobject 这个才是比较引用的地址;
otherObject == null 判断是为了下一步调用otherObject 对象,不出现空指针异常。
比较class是否相同时为了下面的强制转换类型
希望采纳。

Pfeffer
Pfeffer 请您看一下我在评论中插入的图片。
接近 3 年之前 回复
Pfeffer
Pfeffer 对于您的第一个回答,书上说equals比较的是引用,我的问题中还问了,为什么要比较他们各自的类是否相等呢? 您并没有回答完的我的问题
接近 3 年之前 回复

1.getClass()调用的是当前对象的getClass()方法,getClass为非静态方法,而equals()方法也是非静态的,皆为当前对象所调用
2.此时比较的是OtherObject与当前对象
使用时为

Object o = new Object(1);
Object other = new Object(2);

o.equals(other);

3.先比较两者的地址,地址相同则两对象必然相同,
再看otherObject是否为空,若为空,则两对象必然不同
最后看两者是否为同一类,若所属类不同则两对象不同

我对于 前面三个if存在的意义完全不理解

图片说明 这个图片中的内容就是告诉我们equals 比较的实际上是引用

kbc_kbc
kbc_kbc 我上面说的第二条就是指你重写的那个,不是指Object的。不好意思我以为你懂,就没详细说
接近 3 年之前 回复
kbc_kbc
kbc_kbc 或者说只比较引用,如果不相等只能说两个对象在内存存放位置不同,但是不能比较内容,实际上我们更关注对象的内容
接近 3 年之前 回复
kbc_kbc
kbc_kbc 问题是你觉得比较两个对象的地址是你想要的么?你是想比较对象里面的属性吧 比如name,adds,等等实际的有价值属性。那么你在自己的员工类里面就要重写父类的equals方法。你看书上也是这么做的
接近 3 年之前 回复
kbc_kbc
kbc_kbc 回复kbc_kbc: 用员工对象调用equals()方法,那你的程序会首先查你的员工类有没有重写equals方法,如果没有就去父类查,查到Object类就直接比较引用了
接近 3 年之前 回复
kbc_kbc
kbc_kbc 哈哈哈 好的 他没说错。但是你也看到了 这是object类,它确实就是比较引用,但是你自己定义的员工类默认继承它,一旦你用员工对象调用
接近 3 年之前 回复

难道你不满意我的回答啊,怎么不采纳呢?

首先看下Object类的equals源码:

  • @param obj the reference object with which to compare.
    • @return {@code true} if this object is the same as the obj
    • argument; {@code false} otherwise.
    • @see #hashCode()
    • @see java.util.HashMap */ public boolean equals(Object obj) { return (this == obj); } 源码中就是用的==,而==只是比较栈内存中的内容,而栈内存中记录的就对象的引用 这是对图片的说明。 而现在我们需要比较的雇员是相同,而且有要求。那么我们应该从以下开启入手: 1、首先2个对象的引用地址是否相同,如果地址相同那么内容一定相同,这就是第一个if 2、验证下被比较者是否为null,为null直接出结果。而当前对象为null的话,直接空指针异常,这是第二个if 3、其次我们需要比较以下当前比较的2个对象的数据类型是否相同,所以使用个Class进行比较这就是第三个if 4、前面三个都验证了,再比较具体的内容是否相同 望采纳,有不明白的可以再交流
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问