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 是一本好书。
我必须猜测此代码序列的输出:
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 是一本好书。