问题描述
嗨,我是java类的新手,我正在尝试比较两个对象。在这种情况下,圆由一个点和一个半径组成。我需要检查点和半径是否相等,但是在我的代码中,即使它们实际上相等,结果也“不相等”。对不起,如果我的问题很愚蠢。我一直在寻找答案,但仍然无法理解问题:\
public class Circle{
private MyPoint point;
private float radius;
public Circle(){
MyPoint temp = new MyPoint(0,0);
point = temp;
radius = 0;
}
public Circle(MyPoint Center,float Radius){
point = Center;
radius = Radius;
}
public Circle(int x,int y,float Radius){
MyPoint temp = new MyPoint(x,y);
point = temp;
radius = Radius;
}
public void seTradius(float Radius){
radius = Radius;
}
public void setCenter(int x,int y){
MyPoint temp = new MyPoint(x,y);
point = temp;
}
public MyPoint getCenter(){
return point;
}
public float geTradius(){
return radius;
}
public boolean equals(Object obj){
boolean ans = false;
if(obj instanceof Circle){
Circle circ = (Circle)obj;
if(radius == (circ.radius) && point.equals( circ.point ) )
ans = true;
}
return ans;
}
public static void main(String args[]){
Circle C1 = new Circle(10,20,5);
Circle C2 = new Circle(10,5);
if(C1.equals(C2))
System.out.println("Equal");
else
System.out.println("Not Equal");
}
在MyPoint类的内部
public class MyPoint{
private int x;
private int y;
public MyPoint(){}
public MyPoint(int x,int y){
this.x = x;
this.y = y;
}
public String toString(){
return "("+x+","+y+")";
}
}
解决方法
您的MyPoint
类没有equals方法,这意味着new MyPoint(1,2)
不等于new MyPoint(1,2)
(尝试!)。
而且,由于您的Circle的equals定义取决于MyPoint的equals定义才能起作用-发生这种情况。
作为将来的参考,您可以使用lombok的@Data
或@Value
来自动执行这些操作-或者,您的IDE可以为您生成它(但是这种情况很丑陋,您必须记得随时进行更新您可以修改/添加/删除字段),并且在java15中,Point可能会成为一条记录,这也将消除为它显式编写equals代码的需要。
正如其他人指出的那样,您尚未为equals()
定义MyPoint
方法:
这里是一个。
public boolean equals(Object obj){
if(!(obj instanceof MyPoint)){
return false;
}
MyPoint that=(MyPoint)obj;
return (this.x==that.x && this.y==that.y);
}
(隐式)使用Object.equals()
张贴代码,如果a和b引用相同的对象,则a.equalis(b)
为true。不是你想要的。
优良作法是,如果您覆盖equals()
,则应该覆盖hashCode()
。
如果不是这样的话,有一天您可能会在Circles
中放一些HashMap
并得到不愉快的惊喜。
暂时不必担心,但是请注意它是否会出现。