
- •Основы классов
- •Общая форма класса
- •Простой класс
- •Объявление объектов
- •Операция new
- •Представление методов
- •Добавление метода к классу Box
- •Возврат значений
- •Добавление метода с параметрами
- •Конструкторы
- •Параметризованные конструкторы
- •Ключевое слово this
- •Скрытие переменной экземпляра
- •Сборка "мусора"
- •Метод finalize()
- •Класс Stack
- •Перегрузка конструкторов
- •Использование объектов в качестве параметров
- •Передача аргументов
- •Возврат объектов
- •Рекурсия
- •Управление доступом
- •Статические элементы
- •Спецификатор final
- •Ревизия массивов
- •Вложенные и внутренние классы
- •Класс String
- •Использование аргументов командной строки
- •Наследование
- •Основы наследования
- •11 Тело класса }
- •Доступ к элементам и наследование
- •Практический пример
- •Переменная суперкласса может ссылаться на объект подкласса
- •Использование ключевого слова super
- •Вызов конструктора суперкласса с помощью первой формы super
- •Создание многоуровневой иерархии
- •II построить клон объекта
- •Когда вызываются конструкторы
- •Переопределение методов
- •Динамическая диспетчеризация методов
- •Зачем нужны переопределенные методы?
- •Применение переопределения методов
- •Использование абстрактных классов
- •Void meth() { // ошибка! Нельзя переопределять.
- •Класс Object
Void meth() { // ошибка! Нельзя переопределять.
System.out.println("Ошибка!");
}
}
Поскольку meth() объявлен как final, он не может быть переопределен в классе в. Если вы попытаетесь сделать это, то получите ошибку во время компиляции.
Методы, объявленные как final, могут иногда улучшать эффективность. Компилятору предоставлено право выполнять встроенные (inline) вызовы таких методов, потому что он "знает", что те не будут переопределяться подклассом. Когда речь идет о небольшой, например, final-функции, то компилятор Java часто может копировать (встраивать) байт-код подпрограммы прямо в точку вызова откомпилированного кода вызывающего метода, устраняя таким образом дополнительные затраты времени, связанные с обычным вызовом (невстроенного метода). Встраивание допустимо только для final-методов. Обычно Java организует вызовы методов динамически, во время выполнения. Это называется поздним связыванием (вызова с вызываемой функцией). Однако, т. к. final-методы не являются переопределяемыми, их вызов может быть организован во время компиляции. Это называется ранним связыванием.
Использование final для отмены наследования
Иногда нужно разорвать наследственную связь классов (отменить наследование одного класса другим). Чтобы сделать это, предварите объявление класса ключевым словом final, что позволит неявно объявить и все его методы. Заметим, что недопустимо объявлять класс одновременно как abstract и final, т. к. абстрактный класс неполон сам по себе и полагается на свои подклассы, чтобы обеспечить полную реализацию. Пример final-класса:
final class A {
// ... - ..
}
// Следующий класс незаконный.
class В extends A { // ОШИБКА! В не может быть подклассом А
// .. .
}
Комментарий здесь означает, что в не может наследовать а, т. к. а объявлен
как final.
Класс Object
В Java определен один специальный класс – object. Все другие классы являются его подклассами, object – это суперкласс всех других классов. Это означает, что ссылочная переменная типа object может обращаться к объекту любого другого класса. Кроме того, т. к. массивы реализуются как классы, переменная типа object может также обращаться к любому массиву. object определяет методы (табл. 8.1), что означает, что они доступны в каждом объекте.
Таблица 8.1. Методы object
Метод Цель Object clone () Создает новый объект, который является таким же, как имитируемый объект boolean equals (Object object) Определяет, является ли один объект равным другому void finalize () Вызывается прежде, чем неиспользованный объект будет переработан (сборщиком мусора) Class getClass () Получает класс объекта во время выполнения int hashCodeO Возвращает хэш-код, связанный с вызовом объекта void notify () Возобновляет выполнение потока, ожидающего на объекте вызова void notifyAUO Возобновляет выполнение всех потоков, ожидающих на объекте вызова string toStringO Возвращает строку, которая описывает объект void wait() Ждет выполнения на другом потоке void wait (long mil.lisrconds) void wait (long millisrconds , int nanoseconds) |
Методы getClassO, notify (), notifyAHO И wait О объявлены как final.
Другие можно переопределять. Указанные методы описаны в других местах этой книги. Здесь отметим два метода: equals о и tostringo. Метод equals о сравнивает содержимое двух объектов. Он возвращает true, если объекты эквивалентны, и false– в противном случае. Метод Tostringo возвращает строку, содержащую описание объекта, на котором он вызывается. Кроме того, этот метод вызывается автоматически, когда объект выводится методом println (). Много классов переопределяют данный метод, что позволяет им приспосабливать описание специально для типов объектов, которые они создают. Дополнительную информацию о методе tostringo можно получить в главе 13.