0

私は持っていclass Dog extends Animalます。

次に、次のように hashCode() メソッドを呼び出します。

Animal animal  = new Dog(200);
System.out.println(animal.hashCode());

ここで
、Dog クラスの hashCode() をオーバーライドすると、それが返されます。それ以外の場合は、 Dog クラスで hashCode() をオーバーライドした場合に返されます。それ以外の場合は、整数が返されます。

知りたい...

  • Dog クラスでオーバーライドされていないのに、スーパー クラスの hashCode() を呼び出すのはなぜですか? 「何らかの整数」がどのように、そして何を生成したか

  • hashCode がどこにも生成されていない場合。(オブジェクトの記憶場所だと聞いたことがありますが、よくわかりません。)

4

4 に答える 4

4

これは、メソッドのオーバーライドと呼ばれます。このhashCodeメソッドはjava.lang.Object、基本的にオブジェクト階層の最上位にある で定義されているため、Java で定義された任意のオブジェクトで常に使用できます。メソッドが特定のサブクラスまたはその親のいずれかでオーバーライドされていない場合、で定義されているデフォルトの動作java.lang.Objectが呼び出されます。

通常、ハッシュ コードの内部実装が親オブジェクトにあることを気にする必要はありませんが、既定の実装ではオブジェクトの内部アドレスが使用されます。この内部アドレスはまさにそれであることに注意してください。JVM が内部で使用する解釈されたアドレスであり、特に意味のあるものであるためにアプリケーションが依存するべきではありません。

オーバーライドがどのように機能するかについては、Java 言語仕様 - セクション 8.4.8 を参照してください。

于 2012-05-23T04:49:08.410 に答える
0
  1. 最初にJavaでは、明示的に言及されていない場合、すべてのクラスはオブジェクトクラスを親クラスとして持ちます
  2. Java は hashCode() を生成しません。つまり、これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法は Java TMプログラミング言語では必要ありません。ほとんどのクラス (特に Collection API のいずれかで使用する場合)、特に hashcontainer(HashSet および HashMap) では、独自の HashCode (および契約により独自の equals メソッド) を実装する必要があります。

hashCode() と equals() を実装するタイミングを知りたい場合は、このサイトhttp://www.javabeat.net/2007/08/hashcode-and-equals-methods/にアクセスしてください。

于 2012-05-23T06:23:15.263 に答える
0

Java では、明示的に言及されていない限り、すべてのクラスは Object クラスを親クラスとして持ちます。Object クラスは hashcode メソッドを定義しているため、クラスで定義しなくても利用できます。はい、Java では、デフォルトのハッシュコードの実装は、オブジェクトのメモリ位置を返すことです。ある意味では、2 つのオブジェクトが同じである必要があるのではなく、同じメモリ位置にあるかのように、これは正しい方法に見えます。

于 2012-05-23T04:55:51.083 に答える
0

hasCode() はフォームの親クラス オブジェクトであるため、オーバーライドしていない場合は親メソッドが呼び出されます。あなたが整数と呼んでいるのは、スーパー親オブジェクトで生成された hashCode だと思います。Animal クラスで hashCode をオーバーライドしていないことを示唆しています。

一般に、スーパー クラス メソッドがオーバーライドされていない場合、直接の親のメソッドが呼び出されます。

于 2012-05-23T05:02:51.147 に答える