好的,首先对不起,如果这段代码很乱,而且我的equals()完全错了,但这是我第一次使用它。
我正在尝试创建一个equals方法来检查两条线是否相等,如果两个端点相同,则将两条线定义为相等。
我的第一个问题是,我是否接近Point类中的方法,以及如何从Line类调用Point类中的equals()方法?
感谢您的帮助。
public class Point {
private int x;
private int y;
public Point( int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public String toString() {
return "x=" + x + ", y=" + y;
}
public boolean equals(Object o) {
if (!(o instanceof Point)) {
return false;
}
return (x == ((Point) o).x && y == ((Point) o).y);
}
}
}
返回this.y,它说“无法访问的代码”。我的物体也应该是“点”还是“线”?
public class Line {
private Point beg, end;
Color color;
public Line(Point beg, Point end, String color) {
this.beg = beg;
this.end = end;
public Point getEnd() {
return end;
}
public Point getBeg() {
return beg;
}
public Color getColor() {
return color;
}
public String toString() {
return "Beg=" + beg + ", End=" + end + ", Color" + color.toString();
}
Line() {
return this.beg.equals(Point.x);
return this.end.equals(Point.y);
}
}
我在点类中更新了equals()但是我仍然无法从Line类中调用它,它是否会有类似的修复?
感谢您的帮助。
答案 0 :(得分:1)
它是无法访问的代码,因为您之前通过return
退出了该方法。你可能意味着this.x == ((Point)o).x && this.y == ((Point)o).y
。
你应该有类似的东西:
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (!(o instanceof Point)) {
return false;
}
return (x == ((Point) o).x && y == ((Point) o).y);
}
此外,对于Line
课程,您需要比较相关字段(beg
和end
)。
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
if (!(o instanceof Line)) {
return false;
}
return (beg == ((Line) o).beg && end == ((Line) o).end);
}
当您覆盖equals
(和hashCode
时,总是成对编写它们)最好使用@Override
注释,以防您编写public boolean equals(Point o)
(错误地注意参数是Point
,而不是Object
),因此编译器会捕获它。
答案 1 :(得分:0)
它表示无法访问的代码,因为您的equals()方法将在return this.x == ((Point)o).x;
尝试使用:
public boolean equals(Object o) {
if(this.x == ((Point)o).x && this.y == ((Point)o).y) {
return true;
}
return false;
}
可以缩短为:
public boolean equals(Object o) {
return this.x == ((Point)o).x && this.y == ((Point)o).y;
}
答案 2 :(得分:0)
应该是:
public class Point {
public boolean equals(Object o) {
return (this.x == ((Point)o).x) && (this.y == ((Point)o).y);
}
}
这样您的代码就无法访问。
另外你必须检查:
if (!(o instanceof Point)) return false;
答案 3 :(得分:0)
在第一次return
调用之后,该方法退出,因此永远不会评估第二个方法。
改为使用return (this.x == ((Point)o).x) && (this.y == ((Point)o).y);
。
public class Point {
public boolean equals(Object o) {
if(o == null) return false;
if(!(o instanceOf Point) return false;
return (this.x == ((Point)o).x) && (this.y == ((Point)o).y);
}
}
答案 4 :(得分:0)
你不可能一个接一个地有2个返回语句,因为第二个语句总是无法访问。您可以使用此功能,评估x
是否等于o.x
而y
等于o.y
:
public boolean equals(Object o) {
return this.x == ((Point)o).x && this.y == ((Point)o).y;
}
答案 5 :(得分:0)
'return'语句退出方法,这就是为什么永远不会到达任何代码的原因。此外,最好检查传递的对象是否属于正确的类,以避免类强制转换异常:
public boolean equals(Object o) {
if (o instanceof Point) {
Point po = (Point) o;
return this.x == po.x && this.y == po.y;
}
return false;
}
参数需要是'Object'而不是'Point',所以这个方法会覆盖Object.equals方法
答案 6 :(得分:0)
您正在使用
return this.x == ((Point)o).x;
return this.y == ((Point)o).y;
此代码将在检查x后返回,但永远不会到达y。
因此,为了使您的代码正常工作,请使用
return (this.x == ((Point)o).x)&&(this.y == ((Point)o).y);
此代码将检查x和y两者,然后返回
答案 7 :(得分:0)
如果你重写equals,你应该/必须覆盖hashCode()!
public boolean equals(Object o) {
if(o==this){return true;}
if(!o instanceof Point){return false;}
Point p = (Point)o;
return (this.x==p.x && this.y==p.y);
}