(Продолжение, начало см. в МК № 50—52 (169—171)) Ранее я продемонстрировал вам незначительную часть возможностей языка Java, касающихся создания пользовательского интерфейса (UI, User Interface). Но это не сам язык, это только набор команд для обращения к каркасу приложений Swing. Понятно, что при этом используется синтаксис языка Java, а стало быть, какое-то впечатление от языка вы уже получили. Но чтобы хорошо понимать, зачем нужны все эти слова и почему они располагаются в таком порядке, необходимо более глубокое изучение, погружение в язык. Этим сейчас и займемся.

Класс, объект и другие мудреные понятия

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

Базовым элементом в таких языках является класс. Термин «класс» в языках программирования хорошо ассоциируется с общеупотребительным значением этого слова: класс автомобилей, класс млекопитающихся, класс хвойных деревьев, рабочий класс и т. д. То есть, класс — это ряд отдельных элементов, отобранных по определенному признаку. Все эти признаки описаны в шаблоне, который, собственно, и называется «классом». Например, чтобы определить класс автомобилей, необходимо описать все основные признаки, по которым мы можем распознать автомобиль и не спутать его с чайником. Например, для автомобиля это может быть: колеса, руль, мотор, переключатель скоростей. Наличие этих базовых элементов у любого устройства дает нам право отнести его к классу автомобилей.

Любой класс (это тоже знакомо) может иметь подкласс. Полученный подкласс может делиться на еще более мелкие подклассы, и так до бесконечности. Например, класс автомобилей может быть разделен на два подкласса: легковые автомобили и грузовые автомобили. Класс грузовых автомобилей, в свою очередь, может быть разделен на тяжелые грузовики и легкие грузовики, и т. д. Класс легковых автомобилей можно разделить на класс «Мерседесов» и класс «Запорожцев» — то бишь машины для «буржуазного» и для «рабочего класса». Соответственно, для каждого нового подкласса мы создает свой шаблон (класс), где дополнительно описываем присущие только этому классу свойства. Например, в классе грузовых автомобилей, в дополнение к общим свойствам класса автомобилей, должен быть выделен такой отличительный признак, как наличие кузова. Видите, как удобно. Всего два слова: «грузовой автомобиль» — и мы уже представляет себе объект с колесами, рулем, мотором, переключателем скоростей и кузовом.

Именно такая логическая стройность и лаконичность необходима в языках программирования для получения хорошо работающих и легко читаемых программ. В Jav’е это реализовано на редкость хорошо, и потому она так привлекательна для программистов. Вот какой вид будет иметь описание класса автомобилей:

class Автомобиль { колеса, руль, мотор, переключательСкоростей }

Надеюсь, вы осознаете степень условности — на Java все ключевые слова пишутся только английскими буквами. Но пока для лучшего понимания будем пользоваться русским шрифтом и русскими словами, располагая их в соответствии с синтаксисом Java. Каждое входящее в класс понятие должно обозначаться одним словом, поэтому если необходимо использовать словосочетание (например, «переключатель скоростей»), будем записывать его слитно, выделяя каждое слово, кроме первого, заглавной буквой. В отличие от этих элементов, имя любого класса всегда начинается с большой буквы.

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

class Автомобиль { колеса, руль, мотор, переключательСкоростей, движение (переключательСкоростей) {} рульПовернуть (руль) {} }

Это уже достаточно полное описание автомобиля. И если вы создадите у себя в программе класс «Автомобиль», то, давая команды:

Автомобиль.переключательСкоростей = 10; Автомобиль.движение (переключательСкоростей);

вы заставите двигаться автомобиль вперед со скоростью 10 км/час. Но что значит «двигаться вперед»? Как это будет отображаться на экране? Пока никак. Ведь для этого не предусмотрено никаких действий. Все это надо еще описать. Пока мы поступим очень просто — в функцию «движение» вставим счетчик пройденного расстояния и будем его отображать. Полная функция «движение» будет выглядеть так:

число движение (переключательСкоростей){ вернуть переключательСкоростей*время; }

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

Запишем класс полностью так, как он должен выглядеть на самом деле, и впоследствии испытаем его. Разумеется, все здесь записано английскими буквами — других компилятор Java просто не понимает.

public class Car{ int wheel=4; public int rudder=0; int motor=100; public int speedSelector=0; public int motion (int speedSelector ){ return speedSelector*time; }; public turnRudder (int rudder){}; }

Но не будем спешить запускать программу и управлять созданным автомобилем. Давайте еще раз остановимся на понятии «класс», формализуем некоторые моменты и определим новые понятия.

Вы видите, что класс представляет из себя набор идентификаторов, которым присваиваются некоторые значения (это «колеса», «руль», «мотор», «переключатель скоростей») и функций («движение», «руль повернуть»). Задумайтесь, только цифры и функции — вот вам и весь автомобиль!

Цифры, входящие в состав класса, на языке Java называются полями (в некоторых книгах —свойствами), а функции —методами. В дальнейшем будем использовать только такие определения. О том, что перед нами цифра, свидетельствует предлог int (от английского «integer»). Int — это одно из ключевых слов, используемых компилятором Java для анализа программы. Еще одно ключевое слово, которое встречается в написанной программе, — это слово public. Оно сигнализирует о том, что функцию, перед которой стоит такое слово, можно использовать за пределами класса. Это слово определяет одно из ключевых свойств класса —инкапсуляцию. То есть, по умолчанию все поля и методы можно использовать только в пределах класса, в котором они определены. Но какая польза от класса, с которым нельзя общаться? Оказывается, польза большая! Программист создает класс, создавая множество полей и методов, формирующих необходимые свойства класса и недоступных снаружи. А для тех, кто будет пользоваться данным классом, он открывает только те отдельные методы и поля, которые необходимы при использовании класса. Например, в нашем случае мы определили, что мощность двигателя равна 100 л. с., и никто не сможет больше ее переопределить. Точно так же никто не сможет изменить количество колес. Но переключатель скоростей и угол поворота руля изменить может кто угодно. Также кто угодно может воспользоваться и методами класса, так как перед ними стоит ключевое слово public. Все доступные поля и методы называются интерфейсом класса. Таким образом, программист скрывает от пользователей класса всю реализацию класса и открывает только то, что считает нужным, описывая для всех правила пользования классом — интерфейс класса. Если продолжить аналогию с автомобилем, вы можете только сесть за руль и поехать, но не сможете покопаться в моторе и сменить колесо. Это запрещено, и это очень правильно! Однажды хорошо разработанный класс должен всегда функционировать только так, как задумал разработчик, и никто не должен иметь возможности его изменить. Его необходимо поместить в библиотеку, и в дальнейшем его можно только дополнить. Но об этом поговорим в следующий раз.

(Продолжение следует)