2

私は現在、ポリモーフィズムについて読んでいて、内容に少し混乱しています。私の本の動的バインディングに関するビットは、私も非常に混乱していますが、どの例を挙げればよいかわかりません。おそらく、動的バインディングがどのように機能するかを説明する簡単な例を与えることができますか? 私が知っているのは、特定のタイプでメソッド(?)を呼び出すと、インスタンスが関連付けられている最も具体的なメソッドが呼び出されるということだけです。

また、equals メソッドを使用する場合、Java の equals メソッドを次のようなメソッドでオーバーライドするのはなぜ悪い習慣なのでしょうか。

public boolean equals(Circle circle){
return this.radius == circle.radius;
}

とは対照的に

 public boolean equals(Object circle){
return this.radius == ((Circle)circle).radius;
}

ごちゃごちゃしていて申し訳ありませんが、私はこれらの重要な概念を理解するのに苦労しています。前もって感謝します。

4

3 に答える 3

2

クラスのequalsメソッドは、パラメーターとして を受け取ります。そこでこの方法ObjectObject

public boolean equals(Circle circle){

署名が異なるため、メソッドがオーバーロードされます。equalsオーバーライドしません。ポリモーフィズムの主なポイントは、スーパークラスのオブジェクト参照 (たとえばObject) でサブクラスの実際のオブジェクト (ここではCircle) を参照できることです。また、実際のクラスが何であるかに関係なく、スーパークラス参照でメソッドを呼び出すことができます。であり、実際のインスタンスのクラスのメソッドが呼び出されます。

このようなオーバーロードされたメソッドを持つことはできますが、Object渡されるパラメーターが実際にCircle.

于 2013-09-06T23:26:57.683 に答える
1

(オーバーライドと比較して) equals をオーバーロードすると、予期しない動作が発生する可能性があるため、これは悪い習慣です。Circleクラスに次の基本クラスがあるとします。

class Shape {
  @Overrides
  public void equals(Object other) {
  }

  public void equals(Shape other) {
  }
}

Triangleさらに、も拡張するクラスがあるとしますShape。これを呼び出すとどうなるでしょうか。

circle.equals(triangle);

Shape.equals(Shape)Circle.equals(Object)Triangle タイプに最も近いため、 ではなく が呼び出されます。それは驚くべきことです!;)

私は以前、ポリモーフィズムとJava ポリモーフィズムと equals()equals()に関するブログ記事を書いたことがあります。

于 2014-01-21T21:05:01.607 に答える