Иллюстрированный самоучитель по Java

       

Абстракция


Описывая поведение какого-либо объекта, например автомобиля, мы строим его модель. Модель, как правило, не может описать объект полностью, реальные объекты слишком сложны. Приходится отбирать только те характеристики объекта, которые важны для решения поставленной перед нами задачи. Для описания грузоперевозок важной характеристикой будет грузоподъемность автомобиля, а для описания автомобильных гонок она не существенна. Но для моделирования гонок обязательно надо описать метод набора скорости данным автомобилем, а для грузоперевозок это не столь важно.

Мы должны

абстрагироваться

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

Например, можно совершенно точно предсказать погоду на завтра в определенном месте, но расчеты по такой модели продлятся трое суток даже на самом мощном компьютере. Зачем нужна модель, опаздывающая на два дня? Ну а точность модели, используемой синоптиками, мы все знаем сами. Зато расчеты по этой модели занимают всего несколько часов.

Описание каждой модели производится в виде одного или нескольких

классов

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

полями класса

(class fields). Процедуры, описывающие поведение объекта, называются

методами класса

(class methods). Внутри класса можно описать и

вложенные классы



(nested classes) и

вложенные интерфейсы.

Поля, методы и вложенные классы первого уровня являются

членами класса

(class members). Разные школы объектно-ориентированного программирования предлагают разные термины, мы используем терминологию, принятую в технологии Java.

Вот набросок описания автомобиля:


class Automobile{

int maxVelocity; // Поле, содержащее наибольшую скорость автомобиля 

int speed;        // Поле, содержащее текущую скорость автомобиля 

int weight;       // Поле, содержащее вес автомобиля 

                  // Прочие поля...

void moveTo(int x, int у){   // Метод, моделирующий перемещение

                             // автомобиля. Параметры х и у — не поля

int а = 1;   // Локальная переменная — не поле 

             // Тело метода. Здесь описывается закон 

             // перемещения автомобиля в точку (х, у) 

}

// Прочие методы. . . 

}





Знатокам Pascal




В Java нет вложенных процедур и функций, в теле метода нельзя описать другой метод.

После того как описание класса закончено, можно создавать конкретные объекты,

экземпляры

(instances) описанного класса. Создание экземпляров производится в три этапа, подобно описанию массивов. Сначала объявляются ссылки на объекты: записывается имя класса, и через пробел перечисляются экземпляры класса, точнее, ссылки на них.

Automobile Iada2110, fordScorpio, oka;

Затем операцией

new

определяются сами объекты, под них выделяется оперативная память, ссылка получает адрес этого участка в качестве своего значения.

lada2110 = new Automobile(); 

fordScorpio = new Automobile(); 

oka = new Automobile();

На третьем этапе происходит инициализация объектов, задаются начальные значения. Этот этап, как правило, совмещается со вторым, именно для этого в операции

new

повторяется имя класса со скобками



Automobile ()

. Это так называемый

конструктор

(constructor) класса, но о нем поговорим попозже.

Поскольку имена полей, методов и вложенных классов у всех объектов одинаковы, они заданы в описании класса, их надо уточнять именем ссылки на объект:

lada2110.maxVelocity = 150; 

fordScorpio.maxVelocity = 180;

oka.maxVelocity = 350;    // Почему бы и нет? 

oka.moveTo(35, 120);

Напомним, что текстовая строка в кавычках понимается в Java как объект класса

String

. Поэтому можно написать

int strlen = "Это объект класса String".length();

Объект "строка" выполняет метод

length()

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

string

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

strlen

, равное 24. Подобная странная запись встречается в программах на Java на каждом шагу.

Во многих ситуациях строят несколько моделей с разной степенью детализации. Скажем, для конструирования пальто и шубы нужна менее точная модель контуров человеческого тела и его движений, а для конструирования фрака или вечернего платья — уже гораздо более точная. При этом более точная модель, с меньшей степенью абстракции, будет использовать уже имеющиеся методы менее точной модели.

Не кажется ли вам, что класс Automobile сильно перегружен? Действительно, в мире выпущены миллионы автомобилей разных марок и видов. Что между ними общего, кроме четырех колес? Да и колес может быть больше или меньше. Не лучше ли написать отдельные классы для легковых и грузовых автомобилей, для гоночных автомобилей и вездеходов? Как организовать все это множество классов? На этот вопрос объектно-ориентированное программирование отвечает так: надо организовать иерархию классов.


Содержание раздела