Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
49
Добавлен:
12.05.2015
Размер:
1.82 Mб
Скачать

Глава 7. Методы и классы 173

управление доступом. Через инкапсуляцию можно управлять доступом раз­личных частей программы к членам класса и предотвращать неправильное использование таких членов. Например, разрешая доступ к данным только через хорошо определенный набор методов, есть возможность предотвраще­ния неверного использования этих данных. Таким образом, при правильной реализации класс создает для использования "черный ящик", но внутренняя работа которого не доступна для вмешательства. Однако представленные ранее классы не полностью удовлетворяют этой цели. Например, рассмот­рим класс stack, показанный в конце главы 6. Хотя верно, что методы push о и pop () обеспечивают управляемый интерфейс к стеку, интерфейс этот не предписан. То есть, другая часть программы может обойти указан­ные методы и получить прямой доступ к стеку. Конечно, в неумелых руках это может привести к неприятностям. В данном разделе вашему вниманию будет представлен механизм, с помощью которого можно точно управлять доступом к различным членам класса.

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

Спецификаторы доступа Java: public (общий), private (частный) и protected (защищенный). Java также определяет уровень доступа, заданный по умол­чанию (default access level). Спецификатор protected применяется только при использовании наследования.

Начнем с определения спецификаторов public и private. Когда элемент класса модифицирован спецификатором public, то к этому элементу возмо­жен доступ из любой точки программы. Если член класса определен как private, к нему могут обращаться только члены этого класса. Теперь вы мо­жете понять, почему методу main о всегда предшествовал спецификатор public. Он вызывается кодом, который находится вне программы — т. е. исполняющей системой Java. Когда никакой спецификатор доступа не ис­пользуется, по умолчанию элемент класса считается public в пределах сво­его собственного пакета, но к нему нельзя обращаться извне этого пакета. (Пакеты обсуждаются в следующей главе.)

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

174 - Часть /. Язык Java

Спецификатор доступа предшествует остальной части описания типа эле­мента (члена) класса. То есть он должен начинать предложение объявления такого элемента. Например:

public int i; private double j ;

private int myMethod(int a, char b) { //

Чтобы понимать специфику общего и частного доступа, рассмотрим сле­дующую программу:

/* Эта программа демонстрирует различие между методами доступа public и private.

*/

class Test {

int a; // доступ по умолчанию (public)

public int b; // общий (public) доступ

private int с; // частный (private) доступ

// методы для доступа к переменной с

void setc(int i) { // установить значение с

с = i; } int getc() { // получить значение с

return с; } }

class AccessTest {

public static void main(String args[]) { Test ob = new Test();

// OK, к переменным а и b возможен прямой доступ. ob.a = 10; ob.b = 20;

// He OK и вызовет ошибку. // ob.c = 100; //Ошибка!

// Нужен доступ к с через ее методы. ob.setc(lOO); // OK

System.out.println("a, b, и с: " + ob.a + " " + ob.b т " " + ob.getcO); } }

Внутри класса Test используется доступ по умолчанию, который для этого примера эквивалентен указанию public. Член ь явно определен как public.

Соседние файлы в папке JavaLit