Программирование на JAVA

Навигация

Лекция 1. Что такое Java? История создания

Лекция 2. Основы объектно-ориентированного программирования

Лекция 3. Лексика языка

Лекция 4. Типы данных

Лекция 5. Имена. Пакеты

Лекция 6. Объявление классов

Лекция 7. Преобразование типов

Лекция 8. Объектная модель в Java

Лекция 9. Массивы

Лекция 10. Операторы и структура кода. Исключения

Лекция 11. Пакет java.awt

Лекция 12. Потоки выполнения. Синхронизация

Лекция 13. Пакет java.lang

Лекция 14. Пакет java.util

Лекция 15. Пакет java.io

Лекция 16. Введение в сетевые протоколы

Сложные контуры фигуры необходимо вписать в прямоугольник, чтобы можно было анализировать перекрытия, проверять, не вылезает ли ком­понент за границы контейнера, и т.д. Каждая фигура может иметь цвет, которым ее надо рисовать, может быть видимой, или невидимой и т.д. Очевидно, что полезно создать родительский класс для всех компонент и один раз объявить в нем все общие свойства, чтобы каждая компонента лишь наследовала их.

Но как поступить с методом отрисовки? Ведь родительский класс не представляет собой какую-либо фигуру, у него нет визуального пред­ставления. Можно объявить метод paint() в каждой компоненте незави­симо. Но тогда контейнер должен будет обладать сложной функциональ­ностью, чтобы анализировать, какая именно компонента сейчас обраба­тывается, выполнять приведение типа и только после этого вызывать нужный метод.

Именно здесь удобно объявить абстрактный метод в родительском Классе. У него нет внешнего вида, но известно, что он есть у каждого на­следника. Поэтому заголовок метода описывается в родительском классе, тело метода у каждого наследника свое, а контейнер может спокойно Пользоваться только базовым типом, не делая никаких приведений.

Приведем упрощенный пример:

// Базовая арифметическая операция abstract class Operation {

public abstract int calculate(int a, int b);

Курс

Программирование на Ja^

ПекЦияД

Объектная модель в Java

// Сложение class Addition {

public int calculate(int a, int b) { return a+b;

}

}

// Вычитание class Subtraction {

public int calculate(int a, int b) { return a-b;

}

}

class Test {

public static void main(String s[]) { Operation o1 = new Addition(); Operation o2 = new Subtraction();

o1.calculate(2, 3); o2.calculate(3, 5);

}

}

Видно, что выполнения операций сложения и вычитания в методе main() записываются одинаково.

Обратите внимание - поскольку абстрактный метод не имеет тела, после описания его заголовка ставится точка с запятой. А раз у него нет тела, то к нему нельзя обращаться, пока его наследники не опишут реали­зацию. Это означает, что нельзя создавать экземпляры класса, у которого есть абстрактные методы. Такой класс сам объявляется абстрактным.

Класс может быть абстрактным и в том случае, если у него нет абстрактных методов, но должен быть абстрактным, если такие методы есть. Разработчик может указать ключевое слово abstract в списке модификаторов класса, если хочет запретить создание эк­земпляров этого класса