2015-03-28 2 views
-3

У меня вопрос относительно определения класса в Java. Что касается следующего сегмента кода, то после того, как переключатель if уже проверяет, что h is an instance of Animal, почему нам еще нужно добавить строку Animal ob = (Animal) h? Кроме того, почему второй сегмент кодирования неверен? Я знаю, что он должен прийти от линии public boolean equals (Animal h)относительно определения метода в классе

enter image description here

enter image description here

+4

Вставить код как текст, а не изображения. – chrylis

ответ

2

Object.equals() принимает объект типа Object, поэтому второй пример является неправильным, потому что он принимает Animal объекта вместо этого. В первом случае листинг состоит в том, что переменная имеет тип Object, хотя она фактически является экземпляром типа Animal, поэтому его необходимо отличать, чтобы назначить переменную типа Animal.

+1

Технически неправильно, так как можно перегрузить '.equals()', как показано в коде. – Aify

+1

«Неправильно», я имел в виду, что это, вероятно, не то, что он имел в виду. Я действительно думал об этой формулировке, и я не думаю, что объяснение это сделает мой ответ более полезным для OP. – KSFT

+1

Проблема в том, что нет ничего плохого в перегрузке '.equals()', за исключением того, что при использовании наследования очень сложно поддерживать и отлаживать. – Aify

0

1 - Вы должны проверить с помощью instanceof, поскольку полученный Object h может быть экземпляром любого класса, поскольку в Java все классы автоматически наследуются от класса Object.

Например, это может быть Fruit. И если это Fruit, это не Animal. Если вы попытаетесь отбросить его до Animal в любом случае, будет выброшено ClassCastException.

Вот почему, перед заливкой полученной Object h в Animal, то сначала проверяется, что h на самом деле является экземпляром класса Animal. Если (h instanceof Animal) оценивается в false, это значит, что h не является Animal, поэтому литье не производится, и ClassCastException выбрасывается.

Актерский необходимо сообщить компилятору, что h на самом деле является экземпляром Animal класса (все компилятор знает до сих пор, что h является экземпляром Object класса, потому что это тип аргумента метода). Таким образом, вы можете получить доступ к данным h через членов класса Animal.

2 - Второй метод технически корректен, но проверка и отливка instanceof не нужны, поскольку принятый Animal h не может быть Animal. Итак, зачем проверять, что очевидно? Если метод выполняется, это потому, что он был вызван с аргументом, статический тип которого уже был Animal. Итак, все, что вам нужно сделать, прежде чем обращаться к полям h, проверяет, не h не null.

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