2016-10-08 5 views
1

私はこの質問の背後にある理論的根拠を理解しようとしてきましたが、なぜ結果がそれなのかを知るために苦労しています。私は理解していることすべてを説明し、誰かが私のために空白を埋めることができることを願っています。javaクラスからequalsメソッドをオーバーライドします。オブジェクトクラス

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

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

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

しかし、これは私が混乱してしまうところです:

Object o = new Object() 

Point p = new Point(3,4) 

Object op = new Point(3,4) 

我々は呼び出す場合:

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; 
    } 
} 

は、今、私たちは次のオブジェクトを作成します。

することで、クラスを持っている想像してみて。

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)のメソッドはありません。したがって、op.equals()(引数の種類に関係なく)を呼び出すことによって実行できる唯一のequalsメソッドは、boolean equals (Object o)の署名を持っています。 Pointクラスはboolean equals (Object o)をオーバーライドしているため、後者の3つのケースすべてでメソッド1が呼び出されます。それはObjectが持っている唯一のequals方法だから

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

op以降はObject

op.equals(p) 

であることを考えると

1

は、equals(Object o)メソッドを呼び出します。