Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Для отказа от переопределения
Хотя переопределение методов — одно из наиболее мощных свойств Java, может появиться потребность отказаться от него. Чтобы отменить переопределение метода, укажите модификатор final в начале его объявления. Методы, объявленные как final, не могут переопределяться. Следующий фрагмент иллюстрирует final в таком применении: class A { final void meth () { System. out.println (" Это метод final."); class В extends A { void meth() { // ОШИБКА! Нельзя переопределять System. out.println (" Ошибка! "); Поскольку meth() объявлен как final, он не может быть переопределен в классе в. Если вы попытаетесь сделать это, то получите ошибку во время компиляции. Методы, объявленные как final, могут иногда улучшать эффективность. Компилятору предоставлено право выполнять встроенные (inline) вызовы таких методов, потому что он " знает", что те не будут переопределяться подклассом. Когда речь идет о небольшой, например, final-функции, то компилятор Java часто может копировать (встраивать) байт-код подпрограммы прямо в точку вызова откомпилированного кода вызывающего метода, устраняя таким образом дополнительные затраты времени, связанные с обычным вызовом (невстроенного метода). Встраивание допустимо только для final-методов. Обычно Java организует вызовы методов динамически, во время выполнения. Это называется поздним связыванием (вызова с вызываемой функцией). Однако, т. к. final-методы не являются переопределяемыми, их вызов может быть организован во время компиляции. Это называется ранним связыванием.
Использование final для отмены наследования Иногда нужно разорвать наследственную связь классов (отменить наследование одного класса другим). Чтобы сделать это, предварите объявление класса ключевым словом final, что позволит неявно объявить и все его методы. Заметим, что недопустимо объявлять класс одновременно как abstract и final, т. к. абстрактный класс неполон сам по себе и полагается на свои подклассы, чтобы обеспечить полную реализацию. Пример final-класса: final class A { // Следующий класс незаконный. class В extends А { //ОШИБКА! В не может быть подклассом А Комментарий здесь означает, что в не может наследовать а, т. к. а объявлен как final. Класс Object В Java определен один специальный класс — object. Все другие классы являются его подклассами. Object — это суперкласс всех других классов. Это означает, что ссылочная переменная типа object может обращаться к объекту любого другого класса. Кроме того, т. к. массивы реализуются как классы, переменная типа object может также обращаться к любому массиву. object определяет методы(см. ниже), что означает, что они доступны в каждом объекте.
Методы getClassO, notify(), notifyAll() И wait() объявлены как final. Другие можно переопределять. Указанные методы описаны в других местах этой книги. Здесь отметим два метода: equals() и tostring(). Метод equals () сравнивает содержимое двух объектов. Он возвращает true, если объекты эквивалентны, и false— в противном случае. Метод Tostringo возвращает строку, содержащую описание объекта, на котором он вызывается. Кроме того, этот метод вызывается автоматически, когда объект выводится методом printin (). Много классов переопределяют данный метод, что позволяет им приспосабливать описание специально для типов объектов, которые они создают.
|