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

Is c1.equals(c2) true or false?

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

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 true false false false

所以我的问题是

System.out.println(c1.equals(c2));

对还是错?

这取决于你的class圈子。

c1.equals(c2) 实际上只是用参数 c2 在对象 c1 上调用 class Circle 的方法“equals”。如果有此方法的自定义实现,人们可能希望它 return 为真。 如果有none,则默认为superclass(Object)声明equals,与使用“==”操作符相同

public boolean equals(Object obj) {
    return (this == obj);
}

要添加到现有答案中,如果您想重写 .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(),这样无论何时两个对象都是 "equal",它们也具有相同的哈希码。有关更多信息,this 是一本好书。