几天前,我的教授向我们展示了如何实现equals方法等等。
这是他的equals方法的代码示例,我不理解其中一部分:
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Knjiga other = (Knjiga) obj;
return Objects.equals(isbn,other.isbn);
}
在第一个if语句中,他检查这个(当前对象)是否与对象obj具有相同的引用(&= 39运算符是什么?只比较两个引用)
如果他们得到相同的参考,它将返回真实? 但我们永远不会检查其他字段,例如isbn以及我们可以提供的更多字段,因为如果这两个对象具有相同的引用,方法将永远不会出现。
在我看来,这个方法类似于double equals operator cuz这两个中的任何一个都不会检查字段,只是引用?
答案 0 :(得分:8)
如果被比较的两个对象具有相同的引用,则这是相同的对象,并且在比较其他任何内容时都没有意义。您可以立即返回accessibilityIdentifier
并保存一些比较。
在这种情况下,其他属性保证相同。
答案 1 :(得分:1)
如果delayedexpansion
为真,那么它就是同一个对象,所以它显然是相等的。
如果这两个if条款不是真的
(this == obj)
这意味着这两个对象既来自同一个类,又不是同一个对象,所以使用
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
检查是否两个对象的Knjiga other = (Knjiga) obj;
return Objects.equals(isbn,other.isbn);
相等,如果是,则两个isbn
对象也是相同的。
答案 2 :(得分:1)
请考虑以下代码:
String s1 = new String("Test");
String s2 = new String("Test");
String s3 = s2;
String s4 = "Test";
String s5 = "Test";
System.out.println(s1 == s2); //Prints false
System.out.println(s2 == s3); //Prints true
System.out.println(s3 == s4); //Prints false
System.out.println(s4 == s5); //Prints true
s1
和s2
是String对象的新实例。仅仅因为它们具有相同的表观值“测试”,它们不一定具有与您的程序相同的值。因此,这两者在对象方面并不相同。
s3
是s2
的精确副本,这意味着它与s2
的String实例完全相同。这反过来意味着它们的实例在客观上是相同的。
s4
是直接分配给“Test”的String,不一定是String对象的新实例。因此,客观上,他们并不平等。 (见String Interning)
s5
也直接分配给“测试”,因此它等同于s4
。再次,请参阅string interning以了解其工作原理的详细信息。
这是描述你的情况的一种不太复杂的方式,但是应该对对象比较的基础进行很好的解释。
答案 3 :(得分:1)
代码equals
方法的逻辑:
First condition:
很明显。如果两个对象的引用相同,则返回true
if (this == obj)
return true;
Second condition:
如果其他对象为NULL,则返回false
if (obj == null)
return false;
Third condition:
现在,当前对象和其他对象都不为空。检查两个对象的className是否相同。如果类不同,则返回false。
if (getClass() != obj.getClass())
return false;
Fourth condition:
现在两个对象都不为null并且属于同一个类。检查这些对象中的属性[{isbn
]是否相同。如果它们不相同,则返回false。
Knjiga other = (Knjiga) obj;
return Objects.equals(isbn,other.isbn);
答案 4 :(得分:1)
使用==比较对象引用。通常当你在类中重写equals方法来比较你的类的两个对象时,最好先使用相等的引用。这将比较对象内部的所有属性。 考虑示例Cat类
public class Cat {
String country;
int numberOfCats;
public Cat(String country, int numberOfCats) {
this.country = country;
this.numberOfCats = numberOfCats;
}
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
Cat eqlObj = (Cat) obj;
if(this.country.equals(eqlObj.country) && this.numberOfCats == eqlObj.numberOfCats)
return true;
return false;
}
}
测试课
public class TestCat {
public static void main(String args[]) {
Cat obj1 = new Cat("France", 9600);
Cat obj2 = obj1;
obj1.equals(obj2);
}
}
在上面的测试类中,obj1和obj2都指向同一个Cat对象。比较引用将返回" true",即首先阻塞等于。
另一项测试
public class TestCat {
public static void main(String args[]) {
Cat obj1 = new Cat("France", 9600);
Cat obj2 = new Cat("France", 9600);
obj1.equals(obj2);
}
}
在这个测试类中,为obj1和obj2创建了新对象,因此它们所持有的引用将是不同的。对象中指定的值相同。首先,如果equals中的块将失败,因为参考不同。第三,如果equals中的块将比较值并返回" true"。
希望这会有所帮助..