Skip to content

Модификаторы доступа

Тема: Модификаторы доступа в Java

Модификаторы доступа (access modifiers) — это специальные ключевые слова, которые определяют уровень доступности или видимости классов, полей, методов и конструкторов в Java. Модификаторы доступа помогают структурировать код, ограничивая или открывая доступ к определённым частям программы.

Цель:

  • Знакомство с модификаторами доступа.
  • Понимание того, как они влияют на доступ к элементам класса.
  • Формирование навыков использования модификаторов для лучшей организации и безопасности кода.

Виды модификаторов доступа

Java поддерживает четыре уровня доступа:

  1. public — Общедоступный.
  2. protected — Защищённый.
  3. package-private (по умолчанию) — Доступен в пределах пакета.
  4. private — Приватный (личный).

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

Модификатор Доступ в том же классе Доступ в том же пакете Доступ в подклассе Доступ в других пакетах
public
protected ❌ (но доступен для подклассов в других пакетах)
package-private
private

1. public (общедоступный)

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

Пример использования public:

public class Animal {
    public String name;

    public void makeSound() {
        System.out.println(name + " издает звук");
    }
}

Здесь поле name и метод makeSound доступны для всех классов, которые видят класс Animal, даже если они находятся в другом пакете.


2. protected (защищённый)

Модификатор protected даёт доступ элементам класса в пределах одного пакета и в подклассах (включая подклассы в других пакетах). Часто используется для методов и полей, которые должны быть доступны для классов-наследников, но не для других классов вне пакета.

Пример использования protected:

public class Animal {
    protected String type;

    protected void describe() {
        System.out.println("Это " + type);
    }
}

Здесь поле type и метод describe могут быть унаследованы и доступны в подклассе даже в другом пакете, но недоступны напрямую для других классов вне пакета.


3. package-private (доступен в пределах пакета)

Если модификатор доступа не указан, Java по умолчанию присваивает элементу package-private уровень доступа (иногда называют его "доступом по умолчанию"). Такие элементы доступны только внутри одного пакета и не видны вне его.

Пример package-private:

class Animal {
    String name;

    void makeSound() {
        System.out.println(name + " издает звук");
    }
}

Здесь name и makeSound доступны только классам в одном пакете с Animal. Они не видны для классов в других пакетах.


4. private (приватный)

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

Пример использования private:

public class Animal {
    private String sound;

    private void setSound(String sound) {
        this.sound = sound;
    }
}

Здесь sound и метод setSound доступны только внутри класса Animal. Ни один другой класс, даже в том же пакете, не сможет получить к ним доступ напрямую.


Применение модификаторов доступа в Java

  • public: Используется для методов и полей, которые должны быть доступны из любых других частей программы.
  • protected: Применяется для членов класса, которые нужно наследовать, но не показывать для внешнего доступа вне пакета.
  • package-private: Этот уровень доступа используется по умолчанию для класса или члена класса, если нет необходимости в доступе к ним вне пакета.
  • private: Применяется для полей и методов, которые должны быть скрыты от других классов для обеспечения инкапсуляции.

Примеры для практики

1. Реализация класса с приватными полями и методами доступа

Создайте класс Person с приватными полями name и age. Реализуйте public методы getName, setName, getAge, и setAge, чтобы контролировать доступ к этим полям.

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        } else {
            System.out.println("Возраст должен быть положительным!");
        }
    }
}

2. Использование protected для создания наследуемого класса

Создайте класс Animal с полем protected String type, и наследуйте от него класс Dog. В классе Dog реализуйте метод, который выводит тип животного.

public class Animal {
    protected String type;

    public Animal(String type) {
        this.type = type;
    }
}

public class Dog extends Animal {

    public Dog() {
        super("Собака");
    }

    public void displayType() {
        System.out.println("Тип животного: " + type);
    }
}

3. Пример package-private класса и использования его в одном пакете

Создайте два класса в одном пакете, один из которых (без модификатора) может взаимодействовать с другим.

// Файл: PackageClass.java
class PackageClass {
    String message = "Доступен в пакете";
}

// Файл: Main.java (в том же пакете)
public class Main {
    public static void main(String[] args) {
        PackageClass pc = new PackageClass();
        System.out.println(pc.message);  // Доступен, так как находится в том же пакете
    }
}

Заключение

Модификаторы доступа в Java — важный инструмент для управления доступом к элементам класса, что помогает следовать принципам инкапсуляции и безопасности данных. Выбор подходящего модификатора зависит от того, какой доступ должен быть разрешён другим классам или пакетам.

Основные выводы:

  • public — используется для общедоступных членов класса.
  • protected — позволяет доступ внутри пакета и в подклассах.
  • package-private — ограничивает доступ в пределах пакета.
  • private — обеспечивает скрытие данных, делая элемент доступным только в своём классе.