Progress28.ru

IT Новости
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Переопределение метода tostring java

23. Java – Переопределение (overriding)

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

Так что такое в Java overriding или override – это переопределение.

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

В объектно-ориентированных терминах, переопределение значит перезапись функционала существующего метода.

Содержание

Пример 1

После запуска программы будет выдан такой результат:

В вышеприведённом примере вы можете заметить, что b хоть и является типом Animal, оно запускает метод move в классе Dog. Причина тому: во время компиляции проходит проверка ссылочного типа. Однако, во время выполнения, JVM определяет тип объекта и запускает метод, который принадлежит этому конкретному объекту.

Следовательно, по примеру выше, программа запустится правильно, так как класс Animal имеет метод move. Затем, во время выполнения, он запускает метод, принадлежащий этому объекту.

Рассмотрите следующий пример:

Пример 2

После запуска программы будет выдан такой результат:

Программа выдаст ошибку во время компиляции, так как ссылочный тип b у Animal не имеет метода под именем bark.

Правила переопределения метода

  • Список аргументов должен быть точно таким же, как и для переопределённого метода.
  • Возвращаемый тип должен быть таким же или подтипом возвращаемого типа, объявленного в исходном переопределенном методе в суперклассе.
  • Уровень доступа не может быть более ограниченным, чем уровень доступа переопределённого метода. Например, если метод суперкласса объявлен public, то переопределяемый метод в подклассе не может быть private или protected.
  • Методы экземпляров могут быть переопределены только если они наследованы подклассом.
  • Методы, которые объявлены как final, не могут быть переопределены.
  • Статические методы, которые объявлены как static, не могут быть переопределены, но могут быть повторно объявлены.
  • Если метод нельзя наследовать, то его нельзя переопределить.
  • Подкласс внутри того же пакета, что и суперкласс экземпляра, может переопределять любой метод суперкласса, который не объявлен как private или final.
  • Подкласс в другом пакете может переопределять только не final методы, объявленные как public или protected.
  • Переопределяемый метод может выдавать любые непроверенные исключения вне зависимости от того, переопределяет ли переопределённый метод какие-либо непроверенные исключения или нет. Однако, переопределяемый метод не должен генерировать проверенные исключения, которые являются новыми или более широкими, чем те, которые объявлены переопределённым методом. Переопределенный метод может генерировать более узкие или меньшие исключения, чем переопределенный метод.
  • Конструкторы нельзя переопределить.
Читать еще:  Программы для восстановления удаленных файлов с фотоаппарата

Использование ключевого слова super

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

Пример

После запуска программы будет выдан такой результат:

Всегда переопределяйте метод toStrlng

в классе java.lang.Object предусмотрена реализация метода toString, однако возвращаемая им строка, как правило, совсем не та, которую желает видеть пользователь вашего класса. Она состоит из названия класса, за которым следуют символ «коммерческого at» (@) и его хэш-код в виде беззнакового шестнадцатеричного числа, например «PhoneNumbeг@16ЗЬ91». Общее соглашение для метода toString: возвращаемая строка должна быть «лаконичным, но информативным, легко читаемым

представлением объекта». Хотя можно поспорить, является ли лаконичной и легко читаемой строка «РhопеNumЬег@16ЗЬ91», она не столь информативна, как, например, такая ,строка: «( 408) 867 -5З09’

. Далее в соглашении для метода toSt ring говорится:

«Рекомендуется во всех подклассах переопределять этот метод». Хороший совет, ничего не скажешь.

Эти соглашения не столь строги, как соглашения для методов equals и hashCode (статьи 7 и 8), однако, качественно реализовав метод toString, вы сделаете свой класс более приятным в использовании. Метод toSt ring вызывается автоматически, когда ваш объект передается методу println, оператору сцепления строк (+) или assert (в версии 1.4). Если вы создали хороший метод toString, получить удобное диагностическое сообщение можно простым способом:

System.out.println(«Failed to connect: «+ phoneNumber);

Программисты все равно будут строить такие диагностические сообщения, переопределите вы метод toString или нет, но сообщения не станут понятней, если не сделать этого. Преимущества от реализации удачного метода toString передаются не только экземплярам этого класса, но и объектам, которые содержат ссылки на эти экземпляры, особенно это касается коллекций. Что бы вы хотели увидеть: «» или же ««?

Читать еще:  Как создать точку восстановления системы виндовс 7

Будучи переопределен, метод toString должен передавать всю полезную информацию, которая содержится в объекте, как это было показано в примере с телефонными номерами. Однако это не годится для больших объектов или объектов, состояние которых трудно представить в виде строки. В подобных случаях метод toString возвращает такое резюме, как «Manhattan white pages (1487536 listings)» или «Thread [main, 5, main]». В идеале полученная строка не должна требовать разъяснений. (Последний пример с Th read не отвечает этому требованию.)

При реализации метода toString вы должны принять одно важное решение: будете ли вы описывать в документации формат возвращаемого значения. Это желательно делать для классов-значении (value class), таких как телефонные номера и таблицы. Задав определенный формат, вы получите то преимущество, что он будет стандартным, однозначным и удобным для чтения представлением соответствующего объекта. Это представление можно использовать для ввода, вывода, а также для создания удобных для прочтения записей в фиксируемых объектах, например в документах XML. При задании определенного формата, как правило, полезно бывает создать соответствующий конструктор объектов типа String (или статический метод генерации, см. статью 1), что позволит программистам с легкостью осуществлять преобразование между объектом и его строковым представлением. Такой подход используется в ‘библиотеках платформы Java для многих классов-значений, включая Biglnteger, BigDecimal и большинство примитивных классов-оболочек (wrapper).

Неудобство от конкретизации формата значения, возвращаемого методом toString, заключается в том, что если ваш класс используется широко, то, задав формат, вы оказываетесь привязаны к нему навсегда. Другие программисты будут писать код, который анализирует данное представление, генерирует и использует его при записи

объектов в базу данных (persistent data). Если в будущих версиях вы поменяете формат представления, они будут очень недовольны, поскольку вы разрушите созданные ими код и данные. Отказавшись от спецификации формата, вы сохраняете возможность внесения в него новой информации н его совершенствования в последующих

Читать еще:  Как восстановить удаленные фото с рабочего стола

Будете вы объявлять формат или нет, вы должны четко обозначить ваши

намерения. Если вы описываете формат, то обязаны сделать это пунктуально. В качестве примера представим метод toString, который должен сопровождать класс PhoneNumber (статья 8):

* Возвращает представление данного телефонного номера в виде строки.

* Строка состоит из четырнадцати символов, имеющих формат

* «(ХХХ) YYY-ZZZZ» , где ХХХ – код зоны, УУУ – номер АТС,

* ZZZZ – номер абонента в АТС. (Каждая прописная буква представляет * одну десятичную цифру.)

* Если какая-либо из трех частей телефонного номера мала и

* не заполняет свое поле, последнее дополняется ведущими нулями. * Например, если значение номера абонента в АТС равно 12З, то

* последними четырьмя символами в строковом представлении будут «0123».

* Заметим, что закрывающую скобку, следующую за кодом зоны, и первую * цифру номера АТС разделяет один пробел.

public Stгiпg tоStгiпg() <

геtuгп «(» + tоРаddеdStгiпg(агеаСоdе, З) + «) » +

* Преобразует значение типа iпt в строку указанной длины, дополненную

* ведущими нулями. Предполагается. что i >= О,

Ссылка на основную публикацию
Adblock
detector