Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
56_Java.pdf
Скачиваний:
210
Добавлен:
18.02.2016
Размер:
2.39 Mб
Скачать

Скачано с сайта http://ivc.clan.su

При передаче массива методу как параметра указывается имя и тип массива (как в объявлении), размер не указывается (см. пример).

Классы в Java

Особенности реализации

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

Объект всегда является экземпляром некоторого класса (или массивом). Объект класса имеет данные (переменные) и поведение (методы), определяемые его классом. Поведение — это множество операций, которые объект может выполнять над данными.

Класс — это шаблон, в котором определяются данные и поведение объекта. Объекты одного класса используют общую структуру данных и общее поведение. Применение классов позволяет избегать повторного кодирования.

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

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

java.lang.Object

косвенный суперкласс для любого класса

java.awt.Component

косвенный суперкласс

java.awt.Container

..

java.awt.Panel

..

java.applet.Applet

непосредственный суперкласс

My Applet

производный класс

Непосредственный суперкласс указывается в объявлении класса ключевым словом extends. Если для класса не указан его суперкласс, по умолчанию этот класс расширяет класс java.lang.Object. Любой класс Java всегда является производным от класса Object и может использовать все методы этого класса.

В Java имя класса также является именем нового ссылочного типа. Все переменные, имеющие ссылочный тип, указываемый именем класса, являются объектами (точнее, хранят ссылки на объекты класса). Тип такого объекта может быть определен с помощью новой (в C++ нет!) операции instanceof. Например:

...

String str = "Строка"; boolean bl;

...

bl = str instanceof String; // результат - true

Приведение типов классов см. пример ClassTypesDemo.java.

Правила:

1.Объект всегда может быть приведен к типу своего суперкласса.

2.Обратное приведение к типу класса объекта можно выполнить только с помощью оператора явного приведения типа.

10

Скачано с сайта http://ivc.clan.su

4.Любой тип класса может быть приведен к типу класса Object.

5.После приведения объекта к типу суперкласса все переменные и методы собственного класса

объекта становятся для него недоступными.

Определение класса содержит объявление класса и тело класса.

Объявление класса в Java в общем виде может быть представлено так:

*модификаторы+ class Имя_класса [extends Имя_суперкласса+ [implements Имя(Список)_интерфейса(ов)+

1.Модификаторы класса

public — спецификатор доступа — указывает, что к данному классу возможен доступ из других пакетов. (Доступ может быть выполнен с помощью оператора import либо указанием

квалифицированного имени класса, включающего имя пакета.) В случае отсутствия спецификатора public, доступ разрешен только внутри пакета, в котором данный класс находится!

abstract — модификатор реализации класса — указывает, что класс не может иметь экземпляров. Класс, имеющий хотя бы один абстрактный метод (т.е. метод без реализации), должен быть объявлен как abstract.

final — модификатор ограничения иерархии классов — указывает что класс не может иметь производных классов (например, класс java.iang.String).

2.Имя класса

Как и другие идентификаторы Java, имена классов имеют следующие ограничения: должны начинаться с буквы, символа подчеркивания или знака $;

должны содержать только Unicode-символы;

не должны совпадать с ключевыми словами Java.

Рекомендуется имя любого класса начинать с прописной буквы!

3. Спецификация суперкласса

Суперкласс указывается ключевым словом extends. Он должен быть доступным классом и не иметь модификатора final.

4. Реализация интерфейсов

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

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

Создание экземпляра класса

Объект, имеющий тип данного класса, создается при помощи оператора new.

String str = new String ("Строка");

При этом:

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

вызывается метод-конструктор;

возвращаемая оператором new ссылка на объект присваивается переменной.

При обращении к полям и методам объекта в Java используется только оператор «точка».

Пакеты

1.Пакеты используются для объединения связанных между собой классов, интерфейсов и других пакетов. Пакетом называется некоторый набор родственных классов.

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

3.Пакет создает собственное пространство имен (в разных пакетах можно использовать одни и те же имена классов). Квалифицированное имя класса включает имя пакета (например, java.applet.Applet).

4.Пакеты в Java аналогичны библиотекам в С и C++, однако их проще создавать и использовать. Пакет импортируется в программу с помощью оператора import.

11

Скачано с сайта http://ivc.clan.su

В отличие от оператора #include, оператор import не связывает с приложением тех классов, которые в нем не используются. Использование оператора import со звездочкой или с непосредственно указанным именем класса не влияет на размер откомпилированного файла. Оператор import применяется только из соображений лучшей читаемости программы.

Операторы import информируют компилятор, в каких пакетах следует искать открытые

классы, используемые в программе без указания квалифицированного имени.

5.Программист может создать собственный пакет с помощью оператора package и поместить в него

любое количество классов (интерфейсов). Например:

package mypackage;

// Оператор должен быть в самом начале файла .java. В имени

 

// пакета рекомендуется использовать только строчные буквы.

public class MyClass

// Компилятор требует, чтобы в исходном файле Java

{...}

// размещался только один открытый класс. Имя файла должно

 

// соответствовать имени открытого класса.

Если оператор package не используется, то классы, входящие в текущий файл, образуют пакет по умолчанию - анонимный пакет. Такие пакеты используются для небольших простых приложений.

6.Пакеты можно устанавливать в каталогах и подкаталогах, создавая древовидную структуру пакетов, отображающую файловую структуру операционной системы. Файл класса, входящего в

пакет, размещается в соответствующем каталоге, имеющем название пакета.

7.При именовании пакетов, которые могут быть использованы другими программистами в среде Internet, действует следующее соглашение:

если URL-адрес поставщика пакета (уникальное доменное имя) www.имя_Web-узла.суффикс

то полное имя пакета начинается с обращенного доменного имени:

суффикс.имя_Web-узла.имя_пакета

8.При поиске пакетов компилятор (интерпретатор) Java использует в качестве корневых каталогов поиска каталоги, указанные в переменной окружения CLASSPATH (по умолчанию — каталоги типа jdk1.5/jre/lib с файлом rt.jar; текущий каталог, имя которого задается с помощью символа «.»).

Установка пути доступа к классам:

1)set CLASSPATH= ... (можно указывать не только имена каталогов, но и имена архивных файлов .jar).

2)Использование опции -classpath при запуске компилятора или интерпретатора Java (рекомендуемый в настоящее время способ).

Управление доступом к элементам класса

Класс в Java может включать в себя поля, методы, методы-конструкторы, а также блоки инициализации и внутренние (вложенные) классы.

К элементам класса относятся поля, методы (и внутренние классы).

Поле — переменная, содержащая данные класса или экземпляра класса (объекта типа данного класса).

Метод — это именованный фрагмент исполнимого кода класса, вызов которого возможен как внутри класса, так и для объектов класса.

Все поля и методы доступны для методов данного класса. Для ограничения доступа к полям и методам из других классов используются спецификаторы доступа.

Откуда возможен доступ

 

Другие классы в

Классы в других пакетах

к элементам

Данный класс

пакете, которому

 

 

Спецификатор доступа

 

принадлежит класс

Потомки

Не потомки

 

 

 

 

 

public

+

+

+

+

protected

+

+

+

-

private

+

-

-

-

по умолчанию

+

+

-

-

В Java имеется 4 уровня доступа, которые перечисляются в порядке возрастания ограничений:

12

Скачано с сайта http://ivc.clan.su

1.Открытый — элемент класса доступен везде, где доступен данный класс.

2.Защищенный — элемент доступен из классов данного пакета и из любого потомка данного класса.

3.Пакетный (стандартный) элемент доступен из классов данного пакета.

4.Закрытый доступ к элементу разрешен в пределах данного класса.

Поля класса

В классе различают несколько разновидностей переменных:

поля (переменные) класса, которые объявляются вне методов и доступны всем методам класса.

локальные переменные метода (а также конструктора, блока инициализации, блока операторов ,...-, выражения условия для управляющей конструкции цикла for), которые объявляются внутри метода, доступны только в этом методе и существуют только во время выполнения метода.

Обязательно должны быть явно инициализированы до использования.

параметры методов, конструкторов, обработчиков исключений. Объявление поля класса имеет вид:

*спецификатор доступа+ *модификаторы+ тип_данных имя_поля *=значение_инициализации+;

1.Спецификаторы доступа (public, protected, private)

Применяют для ограничения доступа к полю из других классов (см. п. «Управление доступом к элементам класса»).

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

2.Модификаторы полей класса

static

Переменная, имеющая этот модификатор, является полем класса в целом и существует в единственном экземпляре, независимо от того, сколько объектов класса создано и создавались ли они вообще.

Поле, указанное как static, принято называть статическим полем или просто полем (переменной) класса. Статическое поле создается при загрузке класса, прекращает существование — при выгрузке.

Поле, не имеющее этого модификатора, называют полем (переменной) экземпляра класса (иногда — нестатическим полем). Такое поле создается для каждого нового экземпляра (объекта) класса и прекращает существование, когда не остается ссылок на этот объект.

Для обращения к статическому полю создавать экземпляр класса не требуется. Для доступа к полю используется имя класса. Например, в классе System имеется статическое поле out типа PrintStream (стандартный поток вывода):

System.out.println();

Инициализация статических полей — см. пример StaticInitDemo.java с комментариями.

final

Этот модификатор поля класса запрещает изменение значения поля после его инициализации (попытка присваивания нового значения приводит к ошибке при компиляции).

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

Например, в классе Integer имеются поля, используемые как константы: public static final int MAX_VALUE = 2147483647;

public static final int MIN_VALUE = -2147483648;

transient

Данный модификатор указывает, что экземпляр переменной не является частью устойчивого состояния объекта и поэтому не должен записываться на постоянное хранение при сериализации объекта, т.е. записи его состояния в файл. Не используется совместно с final и static.

volatile

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

Методы доступа к private-полям

13

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]