Области видимости и модификаторы доступа

Область видимости переменной, метода или класса – это их свойство быть доступными из тех или иных частей кода, т. е. различных областей программы. Область видимости может определяться как самим местом объявления идентификатора, так и применением к нему модификатора доступа.

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

Если переменная объявляется в теле метода, в цикле или условной конструкции, то она исчезает после завершения работы метода, цикла или ветки. То же самое касается аргументов методов, переменные-аргументы существуют только в момент выполнения метода. Следовательно, такие локальные переменные не могут быть доступными из других блоков кода. Модификаторы доступа здесь не используются.

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

В программах на языке Java часто используют два модификатора доступа – public и private. Реже – protected. Кроме того, есть так называемый модификатор по умолчанию, который используется, когда не указан ни один другой.

Если к полю, методу или классу применен модификатор public, к ним можно обращаться из любого места программы. То есть public-сущности доступны любым другим классам как в текущем пакете, так и за его пределами. Данное положение не отменяет необходимости импорта пакета.

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

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

Модификатор protected схож с модификатором по умолчанию, за одним исключением. Поля и методы доступны не только в пределах пакета, но и в классах-наследниках, т. е. производных классах, даже если они находятся в другом пакете.

Таким образом степень приватности увеличивается так: public → protected → default → private.

Рассмотрим пример. Файл Main.java:

public class Main {
    public static void main(String[] args) {
        Book a = new Book("The Way", -50);
        System.out.println(a.getTitle());
        System.out.println(a.getPage());
    }
}

Файл Book.java:

class Book {
    private String t;
    private int p;
    Book(String title, int page) {
        this.t = title;
        this.p = testPage(page);
    }
    String getTitle() {
        return this.t;
    }
    int getPage() {
        return this.p;
    }
    private int testPage(int pg) {
        if (pg > 0) return pg;
        else return -pg;
    }
}

Оба файла находятся в одном каталоге, т. е. принадлежать одному пакету. Поэтому в классе Book можно не использовать модификатор public, чтобы предоставить доступ к Book классу Main. Метод testPage может использоваться только внутри класса Book.

Если бы в каталог, где находятся Main.java и Book.java, был вложен другой каталог-пакет с классами, то эти классы должны были бы иметь модификатор public для доступа к ним из Main.

Таким образом, классы в Java могут иметь модификатор public, либо не иметь явно указанного модификатора. У полей и методов может быть один из четырех, считая модификатор по умолчанию. Однако объявление публичного метода в непубличном классе вряд ли имеет смысл.

Также не следует забывать про модификатор static, который, если используется, пишется после модификатора доступа. Следом указывается тип переменной или возвращаемое методом значение. Далее идут имя переменной или метода. Если метод ничего не возвращает используется ключевое слово void.

Создано