Разработка INTRANET приложений

         

Понятие Класса


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

Класс состоит из описаний переменных и методов (процедур) работы с этими переменными. Соответственно объект будет состоять из места отведенного под эти переменные и процедуры. Выполнение программы будет сводиться к выполнению процедур разных объектов.

Формально описание класса в Java можно представить в виде:

classclass_nameextendssuper_class_name { typevariable_1; typevariable_2; .... typemethod1 ( parms_list) { // method1 body } typemethod2 (parms_list) { //method2 body } .... }

Слово class дает понять компилятору, что начинается описание класса, а слово extends позволяет указать на суперкласс, которому наследует данный класс.

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

Среди всех методов, которые определяются для класса, следует выделить методы-конструкторы. Эти методы используются для порождения объектов (реализаций класса). Именно конструктор отводит место под переменные и размещает код методов класса. Конструктор имеет то же имя, что и сам класс, и этим отличается от прочих методов. Для примера определим класс Point. В этом примере класс Point определяет точку двухмерного пространства. При инициализации этого объекта ему передаются два параметра: координата х и координата y. Далее идет применение этого метода в программе, а точнее в другом классе С_Point. Объект порождается интерпретатором, а затем инициализируется конструктором по вызову оператора new, в котором и указан метод-конструктор. Класс может и не иметь конструкторов, явно описанных в его теле. В этом случае будет использован конструктор суперкласса.

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


classPoint { intx; inty; Point (intx, inty) { this.x = x; this.y = y; } Point (floatx, floaty) { this.x = (float) x; this.y = (float) y; } Point () { this.x = 0; this.y = 0; } } classC_Point { publicstaticvoidmain (Stringargs[]) { Pointp = newPoint (10,20); System.out.println ("x="+p.x+"; y="+p.y); } }

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

Рассмотренный пример примечателен еще и тем, что в нем используются оператор "." и зарезервированное слово "this". Оператор "." нужен для обращения к переменным и методам объекта (реализации класса). Так выражение p.x позволяет сослаться на значение переменной x объекта p, который является реализацией класса Point. Аналогично поступают и при обращении к методам объекта. Заменим конструктор объекта Point на функцию init.

classPoint { intx; inty; voidinit ( inta, intb) { this.x = a; this.y = b; } } classC_Point { Pointp = newPoint (); p.init (10,20); .... }

В этом случае инициализация переменных значениями будет выполняться методом init. При этом обращение к этому методу будет выглядеть как p.init (a,b).

Зарезервированная переменная this позволяет сослаться на переменные и методы текущего объекта, т.е. того объекта, в котором в данный момент находимся. Этот механизм, в частности, полезен в том случае, когда надо сослаться на самого себя, но сослаться на описание мы не можем: ссылаться позволено только на реальный объект, поэтому this позволяет обойти это совершенно естественное ограничение, ведь в момент описания класса имена объектов остаются неизвестными.

Другим зарезервированным словом является слово "super". Оно служит для обозначения переменной, которая ссылается на переменные и методы суперкласса. Использование его часто бывает полезно при инициализации объекта, когда используются переменные класса-родителя, и они требуют своей обработки. Например, инициализация переменных предка будет выглядеть как super ().

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

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



finalintMAX = 64534;

Не смотря на то, что в Java есть сборщик мусора, иногда перед удалением объектов необходимо сделать некоторые действия над ними, например, вытолкнуть файловые буферы. В этом случае в описании класса определяют метод finalize. Всякий раз, когда система будет принимать решение на удаление объекта данного класса, будет выполняться этот метод.

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

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


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