Какие модификаторы доступа существуют в Java и как они работают?

Ответ

Модификаторы доступа в Java определяют область видимости (доступность) классов, методов, полей и конструкторов. Они являются ключевым механизмом инкапсуляции.

Четыре уровня доступа (от самого слабого к самому строгому):

Модификатор Видимость внутри класса Видимость внутри пакета Видимость для подклассов (наследников) Видимость везде
private
default (package-private)
(когда модификатор не указан)
protected
public

Примеры и типичное применение:

// 1. public - доступ отовсюду. Используется для API.
public class ApiService {
    public void publicMethod() { /* ... */ }
}

// 2. protected - доступ в пакете и для наследников.
class BaseClass {
    protected void helperMethod() { /* Для внутренней логики наследников */ }
}

// 3. default (package-private) - доступ только внутри пакета.
// Идеально для скрытия внутренней реализации пакета.
class PackagePrivateHelper { // Модификатор не указан
    void packageMethod() { /* ... */ }
}

// 4. private - доступ только внутри своего класса.
// Основа инкапсуляции, скрытие деталей реализации.
class BankAccount {
    private double balance; // Прямой доступ извне запрещён

    public double getBalance() { // Доступ через public-метод (геттер)
        return balance;
    }
}

Правила для классов:

  • В одном файле может быть только один public-класс, и его имя должно совпадать с именем файла.
  • Классы верхнего уровня могут быть только public или default (package-private).

Ответ 18+ 🔞

Слушай, а вот эти ваши модификаторы доступа в Java — это ж, блядь, чистейшая бюрократия на уровне кода! Сидят себе классы, как в каком-нибудь офисе, и решают: кому можно в их кабинет зайти, а кому — иди нахуй, это приватное.

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

Самый распиздяйский — public. Это как дверь нараспашку в отдел кадров. Заходи кто хочешь, откуда хочешь. Используется для твоего официального API, чтобы все знали, куда стучаться.

public class Stolovaya {
    public void vydatLapshu() { /* ... */ } // Все могут прийти за лапшой
}

Дальше — protected. Это уже поумнее. Как внутренняя дверь в цех, куда пускают только своих работников (package) и стажёров, которые официально оформлены (наследники). Для внутренней кухни наследников — самое то.

class BaseTseh {
    protected void secretTechnology() { /* Для своих и для учеников */ }
}

Потом идёт default (или package-private). Вообще, ёпта, гениальная штука! Когда ты НИЧЕГО не пишешь. Это как общий коридор на этаже. Все, кто работает в этом отделе (в одном пакете), могут туда-сюда ходить. А вот чуваки с другого этажа — нихуя. Идеально, чтобы спрятать всю свою внутреннюю подноготную от посторонних глаз.

class VnutrenniyRazgovor { // Ничего не указано — значит default
    void obsuditNachalnika() { /* Только для своих по пакету */ }
}

И наконец, царь и бог — private. Это уже полный пиздец. Как сейф в кабинете директора, доступ только у него самого. Основа всей этой вашей инкапсуляции, блядь. Прячешь данные, а наружу выставляешь только официальные методы-геттеры.

class SchetVBanke {
    private double dengi; // Прямой доступ? Да ты охуел!

    public double skolkoDeneg() { // А вот так — пожалуйста, получи справку
        return dengi;
    }
}

А теперь, внимание, главный прикол с классами, чтобы ты не обосрался: В одном файле public-ным может быть только ОДИН класс, и файл должен называться в честь него, блядь! Как паспорт. Остальные пусть сидят по умолчанию (default). И классы верхнего уровня — они либо public, либо default. На protected или private их, сука, не повесишь — компилятор тебе мозги выест.

Вот и вся магия, ебать мои старые костыли. Расставляй эти модификаторы с умом, а то получится либо публичный бордель, либо бункер параноика.