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

在java中,每个类,如果没有明确提到,都会有Object类作为它的父类。由于 Object 类定义了 hashcode 方法,即使您没有在类中定义,这也是可用的。是的,在 java 中,默认的哈希码实现是返回对象的内存位置。在某种程度上,这看起来是正确的,就好像两个对象位于相同的内存位置而不是它们必须相同。

于 2012-05-23T04:55:51.083 回答
0

hasCode() 是表单父类对象,因此如果您没有覆盖它,则将调用父方法。我认为您所说的某个整数是在超级父对象处生成的 hashCode。这表明您没有覆盖 Animal 类中的 hashCode 。

In general if a super class method is not overridden then the immediate parent's method will be called.

于 2012-05-23T05:02:51.147 回答
0
  1. First In java every class, if not explitcitly mentioned, will have Object class as its parent class
  2. Java doesn't generate hashCode(), i.e. This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language. Most classes (especially if you are going to use it in any of the Collection API) specially in hashcontainer(HashSet and HashMap) should implement their own HashCode (and by contract their own equals method).

If you are interested to know when to implement hashCode() and equals() you can visit this site http://www.javabeat.net/2007/08/hashcode-and-equals-methods/

于 2012-05-23T06:23:15.263 回答