equals 方法 Java 核心技术卷一

图片说明

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

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

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

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

o.equals(other);

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

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

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

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

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

首先看下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、前面三个都验证了,再比较具体的内容是否相同 望采纳,有不明白的可以再交流