← Назад к вопросам

В чем разница между private, default, protected и public?

1.0 Junior🔥 281 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Модификаторы доступа в Java: private, default, protected, public

Модификаторы доступа в Java определяют, где и как можно обращаться к классам, методам и полям. Это один из ключевых механизмов инкапсуляции и контроля видимости кода.

Четыре уровня видимости

1. private (самый ограничивающий)

  • Видимость: только внутри одного класса
  • Область: не видим в подклассах, не видим в других классах пакета, не видим в других пакетах
  • Использование: для скрытия внутренней реализации, деталей класса
public class User {
    private String password;  // Доступен только в User
    private void validatePassword() {  }  // Скрытый метод
}

// В другом классе:
User user = new User();
user.password;  // ❌ ОШИБКА: password имеет приватный доступ

2. default (package-private) — модификатор не указывается

  • Видимость: в пределах одного пакета
  • Область: видим в других классах того же пакета, но не видим в других пакетах и подклассах из других пакетов
  • Использование: для внутренних деталей пакета, когда хочешь скрыть от других пакетов
// в пакете com.example.users
class UserValidator {  // default доступ
    void validate() { }
}

// В том же пакете:
UserValidator validator = new UserValidator();  // ✅ OK

// В другом пакете:
UserValidator validator = new UserValidator();  // ❌ ОШИБКА

3. protected

  • Видимость: в пределах пакета + в подклассах (даже в других пакетах)
  • Область: видим в других классах того же пакета и в подклассах других пакетов
  • Использование: для методов/полей, которые должны быть доступны подклассам, но скрыты для внешних классов
public class Animal {
    protected void makeSound() {  }
}

// В другом пакете:
public class Dog extends Animal {
    @Override
    protected void makeSound() {  }  // ✅ Доступно в подклассе
}

// Но:
Animal animal = new Dog();
animal.makeSound();  // ❌ ОШИБКА (если это не public)

4. public (самый открытый)

  • Видимость: везде (во всех пакетах, всех классах)
  • Область: полностью доступен
  • Использование: для API класса, методов, которые должны быть доступны снаружи
public class User {
    public String getName() {  }
}

// Везде доступно:
User user = new User();
user.getName();  // ✅ OK

Таблица видимости

МодификаторКлассПакетПодкласс (другой пакет)Везде
private
default
protected
public

Практические примеры

public class BankAccount {
    // ❌ Скрываем деньги от внешнего кода
    private double balance;
    
    // ✅ Предоставляем контролируемый доступ
    public double getBalance() { 
        return balance; 
    }
    
    // ❌ Метод валидации доступен в пакете, но не снаружи
    protected boolean isValidAmount(double amount) {
        return amount > 0;
    }
    
    // Для внутреннего использования
    private void logTransaction() { }
}

// Другой пакет:
BankAccount account = new BankAccount();
account.getBalance();  // ✅ OK (public)
account.balance;  // ❌ ОШИБКА (private)
account.isValidAmount(100);  // ❌ ОШИБКА (protected)
account.logTransaction();  // ❌ ОШИБКА (private)

Правила хорошей практики

  1. Максимально сужай видимость: используй самый ограничивающий модификатор
  2. Раскрывай только API: делай public только то, что действительно должно быть доступно
  3. Скрывай реализацию: используй private для деталей реализации
  4. Для наследования: используй protected для методов, которые должны быть переопределены в подклассах
  5. Default для пакетов: если это внутренняя деталь одного пакета, используй default
В чем разница между private, default, protected и public? | PrepBro