Avatar ·

Quelle est la différence entre public, protected, package-private et private en Java ?

Bonjour à tous ! Je viens de commencer à apprendre Java et je n'arrive pas à comprendre les modificateurs d'accès. J'ai l'impression de comprendre qu'ils contrôlent la visibilité des classes, méthodes et champs, mais en pratique, je me trompe constamment.

Par exemple, j'ai ce code :

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"; // accessible
        age = 5;        // accessible
        breed = "Lab";  // accessible
        // id = "123";  // PAS accessible - private
        makeSound();    // accessible
    }
}