如何fix/implement等于Java中的方法?
How to fix/implement equals method in Java?
我正在尝试实现 Java 中 equals 方法的扩展。问题是,出于某种原因,它给出了错误的响应。
public class Cordes{
private static double x;
private static double y;
public Cordes(double x, double y) {
this.x = x;
this.y = y;
}
public boolean equals(Object somethingelse) {
if (this == somethingelse) {
return true;
}
if (somethingelse instanceof Cordes) {
Cordes theother = (Cordes) somethingelse;
return (this.x == theother.x) && (this.y == theother.y);
}
return false;
}
public static void main(String[] args) {
Cordes p = new Cordes(2.0, 4.0);
Cordes p2 = new Cordes(3.0, 4.0);
System.out.println(p.equals(p2));
}
所以这是真的,尽管它显然应该是假的。我不确定在这里尝试什么,代码的第一部分试图匹配内存地址,这应该是错误的。另一个 if 语句试图查看它是否是我们 class 的一部分,如果是,它将尝试查看这些坐标是否相等,这应该 return false.
除此之外,我还有一个小问题:当我们在 "somethingelse" 上转换 Cordes 时,这实际上意味着什么,其他对象不是已经是对象了吗,为什么我们必须转换它,以及为什么该操作使我们能够 "theother.x / theother.y".
提前致谢!
从 x 和 y 中删除 static
。 static
这些 class 的所有实例的变量都是相同的。
private double x;
private double y;
您将成员变量声明为静态的:
private static double x;
private static double y;
这意味着它们由所有 Cordes 实例共享。当您构造第二个时,它会更改两者的值。如果将这两行中的 static
去掉,应该没问题。
这两个字段不应该是static
,
private static double x;
private static double y;
这些应该是 instance
个变量,因为您正在创建不同的对象并比较它们。删除 static
修饰符,它应该可以工作。
通过声明 x
和 y
静态:
private static double x;
private static double y;
您将其设为 class 变量而不是实例变量,这意味着所有实例都具有相同的 x
和 y
值。
这就是为什么 equals
对于 Cordes
.
的每个实例都是正确的
要修复删除静态修饰符。
编辑: 至于附带问题:您正在将类型为 Object
的参数传递给 equals
。您将它转换为 Cordes
,意思是告诉编译器它不仅是一个 Object
,而且是一个 Cordes
类型的对象,并且可以像一个对象一样对待。
您已将 x 和 y 声明为静态变量。因此,当您使用 x=3.0 创建对象 p2 时,它会自动更改对象 p 之前的 x 值。
所以只需从
中删除 static 关键字
private static double x;
private static double y;
你会得到想要的结果。
我正在尝试实现 Java 中 equals 方法的扩展。问题是,出于某种原因,它给出了错误的响应。
public class Cordes{
private static double x;
private static double y;
public Cordes(double x, double y) {
this.x = x;
this.y = y;
}
public boolean equals(Object somethingelse) {
if (this == somethingelse) {
return true;
}
if (somethingelse instanceof Cordes) {
Cordes theother = (Cordes) somethingelse;
return (this.x == theother.x) && (this.y == theother.y);
}
return false;
}
public static void main(String[] args) {
Cordes p = new Cordes(2.0, 4.0);
Cordes p2 = new Cordes(3.0, 4.0);
System.out.println(p.equals(p2));
}
所以这是真的,尽管它显然应该是假的。我不确定在这里尝试什么,代码的第一部分试图匹配内存地址,这应该是错误的。另一个 if 语句试图查看它是否是我们 class 的一部分,如果是,它将尝试查看这些坐标是否相等,这应该 return false.
除此之外,我还有一个小问题:当我们在 "somethingelse" 上转换 Cordes 时,这实际上意味着什么,其他对象不是已经是对象了吗,为什么我们必须转换它,以及为什么该操作使我们能够 "theother.x / theother.y".
提前致谢!
从 x 和 y 中删除 static
。 static
这些 class 的所有实例的变量都是相同的。
private double x;
private double y;
您将成员变量声明为静态的:
private static double x;
private static double y;
这意味着它们由所有 Cordes 实例共享。当您构造第二个时,它会更改两者的值。如果将这两行中的 static
去掉,应该没问题。
这两个字段不应该是static
,
private static double x;
private static double y;
这些应该是 instance
个变量,因为您正在创建不同的对象并比较它们。删除 static
修饰符,它应该可以工作。
通过声明 x
和 y
静态:
private static double x;
private static double y;
您将其设为 class 变量而不是实例变量,这意味着所有实例都具有相同的 x
和 y
值。
这就是为什么 equals
对于 Cordes
.
的每个实例都是正确的
要修复删除静态修饰符。
编辑: 至于附带问题:您正在将类型为 Object
的参数传递给 equals
。您将它转换为 Cordes
,意思是告诉编译器它不仅是一个 Object
,而且是一个 Cordes
类型的对象,并且可以像一个对象一样对待。
您已将 x 和 y 声明为静态变量。因此,当您使用 x=3.0 创建对象 p2 时,它会自动更改对象 p 之前的 x 值。
所以只需从
中删除 static 关键字private static double x;
private static double y;
你会得到想要的结果。