Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






 

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

В 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). В программе использован следующий подход: доступ к закрытым членам осуществляется через открытые методы. На первый взгляд такой способ реализации класса может показаться нелогичным и неудобным, но это не так. Представим ситуацию, когда необ­ходимо ограничить и четко регламентировать операции, допустимые с полями класса. Самый надежный способ для этого — сделать поля закрытыми, а для допустимых операций над полями предусмотреть открытые методы. Аналогия такая, как если бы мы имели дело с черным ящиком (класс). Внутреннее содер­жимое ящика — закрытые члены класса. Открытые методы — рычажки, которые позволяют запускать внутренние механизмы. Что не предусмотрено конструк­цией, выполнено быть не может. Это позволит сделать код безопасным, а работу с объектами класса удобной. Данная методика широко используется на прак­тике. Кроме того, нередко закрытыми членами класса делают вспомогательные методы, которые применяются только в пределах программного кода класса на промежуточных этапах вычислений.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.