Освой Java играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Видимость. Спецификаторы доступа

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

Способ доступа определяется модификатором доступа, который добавляется при объявлении. Всего их четыре:

  • private (закрытый)
  • public (открытый)
  • protected (защищённый)
  • доступ по умолчанию, когда никакой модификатор не присутствует

Примеры объявление модификаторов (он всегда должен быть первым):

public int i;
private double j, k;
private int createMethod(int a) {...};
public class Cat{}

Как видите, модификатор применим к переменной, методу, классу.

public

При использовании ключевого слова public вы сообщаете, что следующее за ним объявление члена класса доступно для всех из любого другого кода вашего проекта.

Предположим, что класс объявлен как public, и в нём имеются два метода. Один private, второй - public. У вас будет доступ к классу и ко второму методу, но не к первому, несмотря на то, что сам класс открыт.

private

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

Все вспомогательные методы классов стоит объявить как private, чтобы предотвратить их случайные вызовы в пакете. Тоже относится и к private-полям внутри класса.

protected

Ключевое слово protected связано с понятием наследования, при котором к уже существующему классу (базовому) добавляются новые члены, причем исходная реализация остается неизменной. Также можно изменять поведение уже существующих членов класса. Для создания нового класса на базе существующего используется ключевое слово extends.

Если при создании нового пакета используется наследование от класса, находящемся в другом пакете, новый класс получает доступ только к открытым (public) членам из исходного пакета. Иногда создателю базового класса необходимо предоставить доступ к конкретному методу производным классам, но закрыть его от всех остальных. В этих случаях используется ключевое слово protected. Спецификатор protected также предоставляет доступ в пределах пакета, т.е. члены с этим спецификатором доступны для других классов из того же пакета.

По умолчанию при отсутствии модификатора члена класса считается открытым внутри своего собственного пакета, но не доступен для кода, расположенного вне этого пакета. Если все классы вашего проекта находятся в одном пакете, то по существу переменная без модификатора является открытой (public).

Рассмотрим вымышленный класс SillySensor


public class SillySensor
{
    private int sensorData;

    public SillySensor()
    {
        sensorData = 0;
    }

    private void calibrate(int iSeed)
    {
        // код для калибровки
    }

    protected void seedCalibration(int iSeed)
    {
        calibrate(iSeed);
    }

    public int getSensorData()
    {
        // Check sensor here

        return sensorData;
    }
}

Класс объявлен как public и доступен в других классах. У класса есть переменная sensorData, которая доступна только в своём классе (private). Конструктор доступен в других классах (public). Метод calibrate() работает только внутри класса (private). Метод seedCalibration() доступен в своем классе или в подклассе (protected). Метод getSensorData() доступен в других классах (public).

Реклама