我有class Dog extends Animal
。
然后我按如下方式调用hashCode()方法。
Animal animal = new Dog(200);
System.out.println(animal.hashCode());
下面,
如果我重写了Dog类中的hashCode(),它将被返回。
否则,如果我重写了Dog类中的hashCode(),它将被返回。
否则返回一些整数。
我想知道......
为什么它会调用超类的hashCode() 在Dog类中重写?如何以及“某些整数”生成的内容
当在任何地方都没有生成hashCode时。 (我听说过 是对象的内存位置但不确定。)
答案 0 :(得分:4)
这称为方法覆盖。 hashCode
方法在java.lang.Object
中定义,基本上是对象层次结构的顶部,因此它始终可用于Java中定义的任何Object。如果在您的特定子类或其父类之一中未覆盖该方法,则将调用java.lang.Object
中定义的默认行为。
您通常不应该担心哈希代码的内部实现在父对象中的内容,但默认实现确实使用了Object的内部地址。请注意,此内部地址正是 - JVM在内部使用 的解释地址,应用程序不应依赖该地址作为特别有意义的内容。
您可以在Java Language Specification - Section 8.4.8中了解有关覆盖效果的更多信息。
答案 1 :(得分:0)
在java中,每个类,如果没有经过深思熟虑,都会将Object类作为其父类。由于Object类定义了hashcode方法,即使您没有在类中定义,也可以使用它。是的,在java中,默认的哈希码实现是返回对象的内存位置。在某种程度上,这看起来是正确的,就好像两个对象在同一个内存位置,而不是它们必须相同。
答案 2 :(得分:0)
hasCode()是父类对象的形式,所以如果你没有覆盖它,那么将调用父方法。我认为你所谓的某个整数是在超级父对象上生成的hashCode。这表明你没有覆盖Animal类中的hashCode。
通常,如果不覆盖超类方法,则将调用直接父方法。
答案 3 :(得分:0)
如果您有兴趣知道何时实施hashCode()和equals(),您可以访问此网站http://www.javabeat.net/2007/08/hashcode-and-equals-methods/