c1.equals(c2)是真还是假?

时间:2016-03-06 17:15:19

标签: java equals

我必须猜测此代码序列的输出:

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));

是真还是假?

2 个答案:

答案 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是一个很好的阅读。