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

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

Для члена с задан доступ private. Это означает, что к нему нельзя обра­щаться из кода, находящегося вне его класса. Так внутри класса AccessTest переменная с не может использоваться прямо. К ней нужно обращаться че­рез ее public-методы setc () и getc (). Если бы вы удалили символ коммен­тария в начале следующей строки, то не смогли бы откомпилировать эту программу из-за нарушения правил доступа:

// ob.c = 100; // Ошибка!

Чтобы увидеть, как управление доступом может применяться в более прак­тическом примере, рассмотрим следующую улучшенную версию класса stack, показанного в конце главы 6.

// Этот класс определяет целый стек, который может содержать 10 значений. class Stack {

/* Теперь как stck, так и tos есть private. Это значит, что они не могут быть случайно или намеренно изменены опасным для стека способом. */

private int stckf] = new int[10]; private int tos;

// инициализировать вершину стека Stack () {

tos = -1; }

// поместить элемент в стек void push(int item) { if(tos==9)

System.out.println("Стек заполнен.") else

stck[++tos] = item; }

// вытолкнуть элемент из стека int pop () { if(tos < 0) {

System.out.println("Стек пуст, return 0; } else

return stck[tos—]; } }

Теперь переменная stck, которая содержит стек, и tos, которая является индексом вершины стека, определены как private. Это означает, что к ним

176 Часть I. Язык Java

нельзя обращаться или изменять их, кроме как через методы push ( > и pop ( ) . Делая tos частной, мы, например, предохраняем другие части программы от неосторожной установки в ней значения, которое находится вне границ массива stck. . ,,

Следующая программа демонстрирует улучшенный класс stack. Попробуйте удалить закомментированные строки для доказательства (самим себе), что члены stck и tos действительно недоступны.

class TestStack { "'

public static void main (String args[j) { Stack mystackl = new Stack ( ) ; Stack mystack2 = new Stack ();

// поместить несколько чисел в стек for(int i=0; i<10; i++) mystackl .push (i) ; fortint i=10; i<20; i++) mystack2 .push (i) ;

// вытолкнуть эти числа из стека System.out.println("Стек в mystackl:"); forfint 1=0; К10; i++)

System.out.println(mystackl.pop ());

System.out.println("Стек в mystack2:"); for(int i=0; i<10; i++)

System.out.println(mystack2.pop'O );

// эти операторы не верны // mystackl.tos = -2; // mystack2.stck[3] = 100; } }

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

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