У меня вопрос относительно определения класса в Java. Что касается следующего сегмента кода, то после того, как переключатель if
уже проверяет, что h is an instance of Animal
, почему нам еще нужно добавить строку Animal ob = (Animal) h
? Кроме того, почему второй сегмент кодирования неверен? Я знаю, что он должен прийти от линии public boolean equals (Animal h)
относительно определения метода в классе
ответ
Object.equals()
принимает объект типа Object
, поэтому второй пример является неправильным, потому что он принимает Animal
объекта вместо этого. В первом случае листинг состоит в том, что переменная имеет тип Object
, хотя она фактически является экземпляром типа Animal
, поэтому его необходимо отличать, чтобы назначить переменную типа Animal
.
Технически неправильно, так как можно перегрузить '.equals()', как показано в коде. – Aify
«Неправильно», я имел в виду, что это, вероятно, не то, что он имел в виду. Я действительно думал об этой формулировке, и я не думаю, что объяснение это сделает мой ответ более полезным для OP. – KSFT
Проблема в том, что нет ничего плохого в перегрузке '.equals()', за исключением того, что при использовании наследования очень сложно поддерживать и отлаживать. – Aify
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
.
- 1. друга в классе определения
- 2. Размещение метода в классе
- 3. HashSet или HashMap без определения метода hashCode() в новом классе
- 4. boost: enable_if для определения выделенного метода в шаблонизированном классе
- 5. Определения Big O относительно ранца
- 6. Ошибка определения массивов в классе
- 7. Порядок определения атрибутов в классе
- 8. определения метода определения в экземпляре объекта R6
- 9. Уточнение относительно метода Factory Patern
- 10. Относительно метода InetAddress «isReachable»
- 11. JAVA относительно конкретного метода
- 12. относительно метода шифрования
- 13. Вызов метода в классе
- 14. ошибка в классе деятельности относительно AnimationListener
- 15. Вопросы относительно расширения JFrame в классе?
- 16. Основные определения метода Python
- 17. Отслеживание определения метода Groovy?
- 18. Несоответствие определения метода JavaScript
- 19. Java. Проблема определения метода
- 20. Ошибка определения метода Javascript
- 21. Свойство требует определения метода
- 22. Вызов метода из метода в другом классе
- 23. Ошибка определения неуказанного метода
- 24. Хороший способ определения метода
- 25. Изменение метода определения
- 26. Android: вызов метода в другом классе
- 27. относительно каждого метода и объекта ('', '[]')
- 28. Переобучение метода «in» в классе
- 29. Вызов метода в определенном классе
- 30. Использование метода self в классе
Вставить код как текст, а не изображения. – chrylis