我必须猜测此代码序列的输出:
Circle c1 = new Circle(5);
Circle c2 = new Circle(5);
Circle c3 = new Circle(15);
Circle c4 = null;
System.out.println(c1==c1);
System.out.println(c1==c2);
System.out.println(c1==c3);
System.out.println(c1.equals(c1));
System.out.println(c1.equals(c2));
System.out.println(c1.equals(c3));
System.out.println(c1.equals(c4));
如果我想通过头脑我猜:
true false false false true true false false
如果我作弊并编译它,我得到:
true false false false false false false false
所以我的问题是,是
的System.out.println(c1.equals(C2));
是真还是假?
答案 0 :(得分:2)
这取决于你的班级圈。
c1.equals(c2)
实际上只是调用方法" equals
"您的类圈子在对象c1上使用参数c2。如果存在此方法的自定义实现,则可能期望它返回true。
如果没有,则默认为equals的超类(Object)声明,这与使用" =="相同。操作
public boolean equals(Object obj) {
return (this == obj);
}
答案 1 :(得分:2)
要添加到现有答案,如果要覆盖.equals()
方法,通常会根据对象的某些属性进行相等。根据我的理解,当且仅当它们具有相等的半径时,您希望圆是相等的。
如果您有.getRadius()
函数,那么样本.equals()
方法定义将是
@Override
public boolean equals(Object o) {
if(o == null) {
return false;
} else if (!(o instanceof Circle)) {
return false;
} else {
return this.radius == ((Circle) o).getRadius();
}
}
我还要补充一点,每当你覆盖.equals()
时,你也应该覆盖.hashCode()
,这样每当两个对象“相等”时,它们也会有相同的哈希码。有关详细信息,this是一个很好的阅读。