2016-10-08 3 views
1

Я пытался выяснить обоснование этого вопроса, и я изо всех сил пытался понять, почему результат такой, какой он есть. Я объясню все, что я понимаю, и надеюсь, что кто-то сможет заполнить пробелы для меня.Переопределение метода equals из java ... Класс объекта

Представьте, что вы есть класс:

public class Point { 
    public boolean equals(Object o) { 
     if (o == null || (!(o instanceof Point)) { // Let's call this method 1 
      return false; 
     } 
     Point other = (Point) o; 
     return x == other.x && y == other.y; 
    } 

    public boolean equals(Point p) { // Let's call this method 2 
     if (p == null) { 
      return false; 
     } 
     return x == p.x && y == p.y; 
    } 
} 

Теперь мы создаем следующие объекты:

Object o = new Object() 

Point p = new Point(3,4) 

Object op = new Point(3,4) 

Если мы называем:

p.equals(o) // this calls method 1 

p.equals(p) // this calls method 2 

p.equals(op) // this calls method 1 

Однако, это где я запутаться ,

op.equals(o) // this calls method 1 

op.equals(op) // this calls method 1 

op.equals(p) // this calls method 1 

Почему последний метод вызова 1? Должна ли подпись метода метода 2 гарантировать призыв туда?

Если бы кто-нибудь мог объяснить это мне, это было бы здорово!

+2

Вы не можете переопределить подпись 'Object.equals (Object)'. –

ответ

5

op является переменной типа Object, у которой нет метода, имеющего подпись public boolean equals(Point p). Следовательно, единственный метод equals, который может быть выполнен путем вызова op.equals() (независимо от типа аргумента), имеет подпись boolean equals (Object o). Класс Point переопределяет boolean equals (Object o), поэтому ваш метод 1 вызывается во всех последних трех случаях.

1

Учитывая, что

Point p = new Point(3,4) 
Object op = new Point(3,4) 

и так op является Object

op.equals(p) 

будет вызывать метод equals(Object o), потому что это единственный метод, который equalsObject имеет.

Смежные вопросы