Студопедия

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

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

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






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






     

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

    В 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.