Как сравнить два объекта Java

Я не понимаю, почему в классе Point, где я вызываю метод объекта, он возвращает false. Итак, в методе в третьем / четвертом / пятом случаях он возвращает false, даже если значения x и y каждого объекта равны нулю.

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

person Megan    schedule 13.07.2020    source источник
comment
интересно, потому что для r, поскольку это объект, не знает, что существует equals2   -  person vmrvictor    schedule 13.07.2020
comment
Всегда используйте @Override для предполагаемого переопределения метода.   -  person chrylis -cautiouslyoptimistic-    schedule 13.07.2020
comment
Вы не должны редактировать вопрос так, чтобы он стал недействительным. Вы изменили свой неправильный метод equals на столь же глупый метод, из-за чего ответ rzwitserloot стал неразборчивым.   -  person NomadMaker    schedule 13.07.2020
comment
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 проблема. Mi interessava solo il motivo per cui stampasse true e false, non il fatto dell'override. @NomadMaker google translate   -  person Megan    schedule 13.07.2020


Ответы (1)


В java только подпись определяет идентичность метода.

Метод equals объекта имеет такую ​​сигнатуру:

boolean equals(Object other).

Это означает, что ваш метод equals совершенно другой. Чтобы метод был замещением родительского метода, все соответствующие части сигнатуры должны соответствовать, в частности, включая типы параметров.

Хороший способ убедиться, что вы не напортачите: добавьте @Override для всех методов, которые, по вашему мнению, что-то переопределяют. В противном случае компилятор сообщит вам о несоответствии между тем, что, по вашему мнению, означает ваш код, и тем, что он означает на самом деле. Попытайся! Добавьте эту аннотацию; вы заметите, что ваша IDE и запуск компиляции javac будут жаловаться на это. Затем обновите свой аргумент до Object вместо Point.

NB: p.equals(r) действительно работает, потому что javac компилирует это как вызов метода equals вашего Point. Тем не менее, вам действительно не нужна эта путаница, когда метод equals объекта Object и метод equals Point не имеют одинаковой сигнатуры.

person rzwitserloot    schedule 13.07.2020