【问题标题】:How to compare two objects Java [duplicate]如何比较两个对象Java [重复]
【发布时间】:2020-07-13 14:03:11
【问题描述】:

我不明白为什么在我调用对象上的方法的 Point 类中,它返回 false。因此,在方法中,在第三种/第四种/第五种情况下,即使每个对象的 x 和 y 的值为零,它也会返回 false。

class Point{
    private int x;
    private int y;
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

public boolean method(Point p) { 
     if (p!=null)    
         return x==p.x && y==p.y;   
     else return false;  
}

}

public class AppPoint{
    public static void main(String[] args) {
        Point p = new Point (0, 0);
        Point q = new Point (0, 0);
        Object r = new Point (0, 0);
        Object s = new Point (0, 0);
        System.out.println(p.method(p));
        System.out.println(p.method(q));
        System.out.println(p.method(r));
        System.out.println(r.method(q));
        System.out.println(r.method(s));
    }
}

// method return: true true false false false

【问题讨论】:

  • 很有趣,因为 r 作为一个对象不知道 equals2 存在
  • 始终使用 @Override 来覆盖预期的方法。
  • 您不应该编辑问题以使答案无效。您将错误的 equals 方法更改为同样愚蠢的方法方法,使 rzwitserloot 的答案难以理解。
  • Cosa avrei dovuto fare dato che mi hanno segnalato la domanda come duplicata e il mio dubbio è rimasto 。 La risposta sotto era corretta ma non mi risolve il mio problema。 Mi interessava solo il motivo per cui stampasse true e false , non il fatto dell'override。 @NomadMaker 谷歌翻译

标签: java boolean instanceof


【解决方案1】:

在 java 中,签名单独定义了方法的身份。

对象的equals方法有这个签名:

boolean equals(Object other).

这意味着您的 equals 方法是完全不同的方法。对于要覆盖父方法的方法,签名的所有相关部分都需要匹配,特别是包括参数的类型。

确保您不会搞砸的好方法:为您认为覆盖某些内容的所有方法添加@Override。如果他们不这样做,编译器会通知您您认为代码的含义与实际含义之间的不匹配。试试看!添加此注释;你会注意到你的 IDE 和 javac 编译运行会抱怨它。然后将您的 arg 升级为 Object 而不是 Point

注意:p.equals(r) 确实有效,因为 javac 将其编译为对 Point 的 equals 方法的调用。不过,您真的不希望出现这种混淆,因为 Object 的 equals 方法和 Point 的 equals 方法没有相同的签名。

【讨论】:

    猜你喜欢
    • 2013-04-10
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多