Доступ к членам класса

 

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

В Java в зависимости от доступности все члены класса можно разделить на три группы: открытые, закрытые и защищенные. Во всех рассматривавшихся ранее примерах все члены классов были открытыми и, в силу этого обстоятельства, доступными за пределами класса. Таким образом, открытые члены класса — это члены класса, которые доступны вне этого класса. Если в каком-то месте про­граммы создается объект класса, то к полям и методам этого объекта можно обращаться способом, описанным ранее (например, в формате объект.метод или объект.поле).

Если поле или метод является закрытым, ничего из упомянутого сделать не удастся. К закрытым членам класса доступ осуществляется только в пределах класса. К закрытому полю можно обращаться в методах класса, но нельзя об­ратиться к полю вне класса. Закрытые методы класса могут вызываться только методами класса, но не могут вызываться извне класса.

Разница между закрытыми и защищенными членами класса проявляется толь­ко при наследовании. Если о наследовании речь не идет, то можно полагать, что защищенный член класса — это аналог закрытого члена.

Нельзя сказать, что все сказанное полностью описывает ситуацию с закрытыми и открытыми членами класса. К этому вопросу мы еще вернемся при изучении наследования, после того как познакомимся с пакетами. Пока же ограничимся таким несколько упрощенным взглядом на предмет.

Для определения уровня доступности используются три идентификатора: public, private и protected — идентификаторы доступа соответственно для открытых, закрытых и защищенных членов. Идентификатор доступа указывается для каж­дого члена класса отдельно. Здесь проявляется отличие языка Java от языка С++: в С++ идентификаторы доступа указываются для групп членов.

Если идентификатор доступа не указан вовсе, соответствующий член считается открытым. Именно этой особенностью мы пользовались ранее, когда не указы­вали для членов класса идентификаторы доступа. Обращаем внимание читате­лей, знакомых с С++: там по умолчанию члены класса считаются закрытыми.

В листинге 4.4 приведен пример использования открытых и закрытых членов класса.

 

Листинг 4.4. Закрытые и открытые члены класса

class MyClass{

// Закрытые поля:

private int a;

private int b;

// Закрытый метод:

private void showab(){

// Обращение к закрытым полям в классе:

System.out.println("a="+a);

System.out.println("b="+b);}

// Открытый метод:

public void setab(int x,int y){

// Обращение к закрытым полям в классе:

a=x;

b=y;

System.out.println("Присвоены значения полям!");}

// Открытый метод:

void getab(){

System.out.println("Проверка значений полей:");

// Обращение к закрытому методу в классе:

showab();}

}

class PrivateDemo{

public static void main(String[] args){

// Создание объекта:

MyClass obj=new MyClass();

// Вызов открытых методов:

obj.setab(3,5);

obj.getab();

}}

В классе MyClass объявлены два закрытых целочисленных поля a и b. Поскольку поля закрытые, присвоить им значения вне класса простым обращением к по­лям невозможно. Для инициализации полей в классе объявляется метод setab() . У метода два целочисленных аргумента, значения которых присваиваются по­лям a и b. Обращаем внимание, что метод setab() имеет доступ ко всем членам класса, в том числе и к закрытым полям, поскольку метод описан в том же клас­се, что и поля. Метод setab() описан с использованием идентификатора уровня доступа public. Хотя в методе getab() идентификатор доступа не указан, метод также является открытым (по умолчанию). В этом открытом методе выпол­няется обращение к закрытому методу showab(), который обеспечивает вывод значений закрытых полей a и b.

В главном методе программы класса PrivateDemo сначала создается объект obj класса MyClass. Командой obj.setab(3,5) закрытым полям объекта obj присваи­ваются значения 3 и 5 соответственно. Командой obj.getab() значения полей выводятся на консоль. В результате выполнения программы получаем:

Присвоены значения полям!

Проверка значений полей:

a=3

b=5

Еще раз хочется отметить, что в методе main() нельзя, например, воспользовать­ся инструкцией вида obj.a, obj.b или obj.showab() , поскольку соответствующие члены класса MyClass являются закрытыми (private). В программе использован следующий подход: доступ к закрытым членам осуществляется через открытые методы. На первый взгляд такой способ реализации класса может показаться нелогичным и неудобным, но это не так. Представим ситуацию, когда необ­ходимо ограничить и четко регламентировать операции, допустимые с полями класса. Самый надежный способ для этого — сделать поля закрытыми, а для допустимых операций над полями предусмотреть открытые методы. Аналогия такая, как если бы мы имели дело с черным ящиком (класс). Внутреннее содер­жимое ящика — закрытые члены класса. Открытые методы — рычажки, которые позволяют запускать внутренние механизмы. Что не предусмотрено конструк­цией, выполнено быть не может. Это позволит сделать код безопасным, а работу с объектами класса удобной. Данная методика широко используется на прак­тике. Кроме того, нередко закрытыми членами класса делают вспомогательные методы, которые применяются только в пределах программного кода класса на промежуточных этапах вычислений.

 








Дата добавления: 2016-06-13; просмотров: 1092;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.