Avatar ·

¿Cuál es la diferencia entre public, protected, package-private y private en Java?

¡Hola a todos! Acabo de empezar a aprender Java y no puedo entender los modificadores de acceso. Parece que entiendo que controlan la visibilidad de clases, métodos y campos, pero en la práctica me confundo constantemente.

Por ejemplo, tengo 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"; // accesible
        age = 5;        // accesible
        breed = "Lab";  // accesible
        // id = "123";  // NO accesible - private
        makeSound();    // accesible
    }
}