2012-05-23 4 views
0

У меня есть class Dog extends Animal.реализация hashCode в java

Затем я вызываю метод hashCode() следующим образом.

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

Здесь
Если я переопределен в хэш-код() в классе Dog он будет возвращен. Если я переопределил hashCode() в классе Dog, он будет возвращен. Осталось некоторое целое число.

Я хочу знать ...

  • Почему вызвать хэш-код() из суперкласса, когда он не переопределен в классе собак? Как и что генерируется «некоторое целое»

  • Когда hashCode не генерируется нигде. (Я слышал, что это место в памяти объекта, но не уверен.)

ответ

4

Это называется переопределения метода. Метод hashCode определен в java.lang.Object, в основном вершине иерархии объекта, поэтому он всегда доступен для любого объекта, определенного на Java. Если этот метод не переопределен в вашем конкретном подклассе или его родителе, будет вызвано поведение по умолчанию, определенное в java.lang.Object.

Обычно вам не следует беспокоиться о том, что внутренняя реализация хеш-кода находится в родительском объекте, но реализация по умолчанию использует внутренний адрес объекта. Обратите внимание, что этот внутренний адрес является именно тем, что - интерпретируемый адрес, который JVM использует внутренне, который не должен зависеть от приложения, чтобы быть чем-то особенно значимым.

Вы можете узнать больше о том, как работают надстройки в Java Language Specification - Section 8.4.8.

+0

Ах, что вы говорите, если хэш-код() переопределяется где-нибудь в иерархии классов , он будет называться. Кроме того, вызывается java.lang.Object. ОК. Тогда что это за «внутренний адрес»? это адрес памяти или как она генерируется? Спасибо за ответ. – namalfernandolk

+0

Реализация по умолчанию возвращает значение, равное возвращаемому значению ['System.identityHashCode()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/System.html# identityHashCode (java.lang.Object)), вызываемый на объект. –

+1

Сказать, что это «внутренний адрес», вводит в заблуждение. Значение может быть * основано * на каком-то адресе, но это ** не ** адрес любого рода, из которого вы можете получить полезную информацию. Это просто квазислучайное число, которое (почти) однозначно идентифицирует объект. (Однако случайность и уникальность не гарантированы). –

0

В java каждый класс, если не указано явно, будет иметь класс Object в качестве родительского класса. Поскольку класс Object определяет метод hashcode, он доступен, даже если вы не определяете его в своем классе. И да, в java реализация hashcode по умолчанию - это вернуть местоположение памяти объекта. В некотором роде это выглядит правильно, как если бы два объекта находились в одном месте памяти, чем они должны быть одинаковыми.

0

hasCode() является родительским классом, поэтому, если вы не переопределили его, будет вызываться родительский метод. Я думаю, что то, что вы называете некоторым целым числом, является hashCode, сгенерированным в супер-родительском объекте. Который предполагает, что вы не переопределили hashCode в классе Animal.

В общем случае, если метод суперкласса не переопределяется, будет вызываться метод непосредственного родителя.

+0

Thanx isuru, Это нормально для меня. Но моя главная проблема заключается в том, как генерируется hashCode по умолчанию и что это такое? – namalfernandolk

0
  1. Первый В Java каждый класс, если не explitcitly упоминалось, будет иметь класс объектов в качестве родительского класса
  2. Java не генерирует хэш-код(), то есть это обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется на языке программирования Java TM. Большинство классов (особенно если вы собираетесь использовать его в любом из API Collection), специально в hashcontainer (HashSet и HashMap) должны реализовать свой собственный HashCode (и заключить контракт своим собственным методом equals).

Если вы заинтересованы, чтобы знать, когда для реализации хэш-код() и Equals(), вы можете посетить этот сайт http://www.javabeat.net/2007/08/hashcode-and-equals-methods/

Смежные вопросы