Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ява.doc
Скачиваний:
4
Добавлен:
14.04.2019
Размер:
264.7 Кб
Скачать

31)Использование ключевого слова final с наследованием

  • Ключевое слово final имеет три применения. Первое — его можно использовать для создания эквивалента именованной константы. Два других применения final связаны с наследованием.

Использование final для отказа от переопределения

  • Чтобы отменить переопределение метода, укажите модификатор final в начале его объявления. Методы, объявленные как final, не могут переопределяться.

class A {

final void meth() {

System.out.println("Это метод final.");

} }

class В extends A {

void meth() { // ОШИБКА! Нельзя переопределять.

System.out.println("Ошибка!");

} }

  • Поскольку meth о объявлен как final, он не может быть переопределен в классе B. Если вы попытаетесь сделать это, то получите ошибку во время компиляции.

Использование final для отмены наследования

  • Иногда нужно разорвать наследственную связь классов (отменить наследование одного класса другим). Чтобы сделать это, предварите объявление класса ключевым словом final, что позволит неявно объявить и все его методы. Недопустимо объявлять класс одновременно как abstract и final.

final class A { // ...

}

// Следующий класс незаконный.

class В extends А { //ОШИБКА! В не может быть подклассом А

// .. . }

  • Комментарий здесь означает, что в не может наследовать А, т.к. А объявлен как final.

30) Использование ключевого слова final для предотвращения наследования. Иногда будет требоваться предотвратить наследование класса. Для этого в начале объявления класса необходимо поместить ключевое слово final. Объявление класса как final неявным образом объявляет все его методы также как final. Как легко догадаться, одновременное объявление класса как abstract и как final недопустимо, поскольку абстрактный класс принципиально является незавершенным и только его подклассы предоставляют полную реализацию методов. Ниже приведен пример класса типа final.

final class А { // ... } // Следующий класс недопустим. class В extends А { // ОШИБКА! Класс А не может иметь подклассы. // ... }

Как видно из комментария, класс в не может наследовать от класса А, поскольку А объявлен как final.

29) Абстрактные классы объявляются с ключевым словом abstract и содержат объявления абстрактных методов, которые не реализованы в этих классах, а будут реализованы в подклассах. Объекты таких классов создать нельзя, но можно создать объекты подклассов, которые реализуют эти методы. При этом допустимо объявлять ссылку на абстрактный класс, но инициализировать ее можно только объектом производного от него класса. Абстрактные классы могут содержать и полностью реализованные методы, а также конструкторы и поля данных.С помощью абстрактного класса объявляется контракт (требования к функциональности) для его подклассов. Примером может служить уже рассмотренный выше абстрактный класс Number и его подклассы Byte, Float и другие. Класс Number объявляет контракт на реализацию ряда методов по преобразованию данных к значению конкретного базового типа, например floatValue(). Можно предположить, что реализация метода будет различной для каждого из классов-оболочек. Хотя объект класса Number нельзя создать, он может получить численное значение любого базового типа. Однако у самого класса нет возможности преобразовать это значение к конкретному базовому типу.

24) Varargs: аргументы переменной длиныВ JDK 5 была добавлена новая функциональная возможность, которая упрощает создание методов, принимающих переменное количество аргументов. Эта функциональная возможность получила название varargs (сокращение термина variable-length arguments — аргументы переменной длины). Метод, который принимает переменное число аргументов, называют методом переменной арности, или просто методом varargs. Ситуации, в которых методу нужно передавать переменное количество аргументов, встречаются не так уж редко. Например, метод, который открывает подключение к Internet, может принимать имя пользователя, пароль, имя файла, протокол и тому подобное, но применять значения, заданные по умолчанию, если какие-либо из этих сведений опущены. В этой ситуации было бы удобно передавать только те аргументы, для которых заданные по умолчанию значения не применимы. Еще один пример — метод printf (), входящий в состав библиотеки ввода-вывода Java. Как будет показано в главе 19, он принимает переменное число аргументов, которые форматирует, а затем выводит. До появления версии J2SE 5 обработка аргументов переменной длины могла выполняться двумя способами, ни один из которых не был особенно удобным. Во-первых, если максимальное количество аргументов было небольшим и известным, можно было создавать перегруженные версии метода — по одной для каждого возможного способа вызова метода. Хотя этот способ подходит для ряда случаев, он применим только к узкому классу ситуаций. В тех случаях, когда максимальное число возможных аргументов было большим или неизвестным, применялся второй подход, при котором аргументы помещались в массив, а затем массив передавался методу.

25) Наследование не что иное, как приобретение свойства другого объекта или класса. Наследование в Java осуществлено отношениями подкласса и суперкласса. Суперкласс - это класс, от которого будет происходить наследование, и подкласс - это класс, который наследовал качества суперкласса. Когда наследование осуществлено, подкласс получает свойства суперкласса плюс его собственные свойства. Например, рассмотрите классы Транспортное средство и Скутер. Свойства класса Транспортное средство - скорость, вместимость, а свойства класса Скутера - вместимость бензина, механизм. Класс Скутер унаследован от класса Транспортное средство. Тогда класс Транспортное средство становится суперклассом, а класс Скутера становится подклассом. Класс Скутера получает свойства (скорость, вместимость) класса Транспортного средства, плюс он имеет свои собственные свойства (вместимость бензина, механизм). Таким образом, подкласс содержит собственные свойства, так же как и его суперкласс. Расширенное понятие наследования В Java используется расширенное понятие наследования. Поскольку подкласс добавляет к своим свойствам унаследованные свойства суперкласса, объект подкласса может обращаться к любому методу суперкласса, но не наоборот. Это происходит потому, что подкласс знает свойства и методы своего суперкласса, так как он унаследован от него. Но суперкласс не знает различные свойства и методы своего подкласса. Суперкласс может иметь п подклассов, но подкласс в Java может непосредственно иметь только один суперкласс. Обратите внимание: Java не поддерживает концепцию множественного наследования.

Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование позволяет поддерживать концепцию иерархии классов. Применение иерархии классов делает управляемыми большие потоки информации. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы полностью его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным. Модификаторы доступа Модификаторы доступа можно рассматривать как с позиции инкапсуляции так и наследования. Если рассматривать с позиции наследования, то модификаторы доступа позволяют путем установки доступа указать члены класса, которые будут наследоваться классом наследником автоматически, а какие нет. Например, переменная или метод, объявленная как public в данном классе будет автоматически перениматься в классе потомке.

Модификатор доступа

Область доступа

public

Без ограничений

private

Только из данного класса

protected

Из данного класса и его потомков

Без модификатора

Для всех классов данного пакета

 

1. Алфавит языка Java Алфавит языка Java состоит из букв, десятичных цифр и специальных символов. Буквами считаются латинские буквы (кодируются в стандарте ASCII), буквы национальных алфавитов (кодируются в стандарте Unicode, кодировка UTF-16), а также соответствующие им символы, кодируемые управляющими последовательностями (о них будет рассказано чуть позже). Буквы и цифры можно использовать в качестве идентификаторов (т.е. имён) переменных, методов и других элементов языка программирования. Правда, при использовании в идентификаторах национальных алфавитов в ряде случаев могут возникнуть проблемы – эти символы будут показываться в виде вопросительных знаков. Как буквы рассматривается только часть символов национальных алфавитов. Остальные символы национальных алфавитов - это специальные символы. Они используются в качестве операторов и разделителей языка Java и не могут входить в состав идентификаторов.

Латинские буквы ASCII

ABCD...XYZ - заглавные (прописные) ,

abcd...xyz – строчные

Дополнительные “буквы” ASCII

_  - знак подчеркивания,

$  - знак доллара.

Национальные буквы на примере русского алфавита

АБВГ…ЭЮЯ - заглавные (прописные),

абвг…эюя – строчные

Десятичные цифры

0 1 2 3 4 5 6 7 8 9