Avatar ·

Qual é a diferença entre public, protected, package-private e private em Java?

Olá a todos! Acabei de começar a estudar Java e não consigo entender os modificadores de acesso. Acho que entendo que eles controlam a visibilidade de classes, métodos e campos, mas na prática fico sempre confuso.

Por exemplo, tenho este código:

public class Animal {
    public String name;
    protected int age;
    String breed; // package-private
    private String id;
    
    public void makeSound() {
        System.out.println("Some sound");
    }
    
    protected void sleep() {
        System.out.println("Sleeping...");
    }
    
    void eat() {
        System.out.println("Eating...");
    }
    
    private void breathe() {
        System.out.println("Breathing...");
    }
}

public class Dog extends Animal {
    public void testAccess() {
        name = "Buddy"; // acessível
        age = 5;        // acessível
        breed = "Lab";  // acessível
        // id = "123";  // NÃO acessível - private
        makeSound();    // acessível
    }
}