Capire Gerarchia, Ereditarietà, Interfacce, Overload e Override in Java (senza annoiarsi)

Gerarchia ed Ereditarietà: come una famiglia… ma di classi

Pensa alla gerarchia in Java come a un albero genealogico.
Se Persona è il genitore, Studente ed Insegnante sono i figli. Entrambi ereditano caratteristiche generiche (nome, età) ma aggiungono comportamenti propri.

È come nel mondo reale: tutti gli esseri umani hanno un cuore (proprietà comune), ma solo alcuni sanno programmare in Java (proprietà specifica 😅).

Esempio Java

class Persona {
    String nome;
    int eta;

    void saluta() {
        System.out.println("Ciao, sono " + nome);
    }
}

class Studente extends Persona {
    void studia() {
        System.out.println("Sto studiando Java!");
    }
}

Implementazione di un’interfaccia: una promessa da mantenere

Un’interfaccia è come un contratto: dice cosa devi fare, ma non come.
È come il foglio delle consegne di un corriere: lui può scegliere il mezzo (motorino, bici, razzo?), l’importante è che ti porti il pacco.

Esempio Java

interface Guidabile {
    void guida();
}

class Auto implements Guidabile {
    @Override
    public void guida() {
        System.out.println("Sto guidando un'auto!");
    }
}

Overload: lo stesso nome, più modi per usarlo

L’overload è quando hai più metodi con lo stesso nome, ma con parametri diversi, cambia la firma del metodo.
È come dire “aprire una porta”: puoi aprirla con una chiave, con un badge, con il riconoscimento facciale… il risultato è lo stesso, il modo cambia.

Esempio Java

class Porta {

    void apri() {
        System.out.println("Apro la porta normalmente.");
    }

    void apri(String chiave) {
        System.out.println("Apro la porta con la chiave: " + chiave);
    }

    void apri(int codice) {
        System.out.println("Apro la porta con codice: " + codice);
    }
}

Override: riscrivere un metodo ereditato

L’override è quando una classe figlia riscrive un metodo ereditato dal genitore per cambiarne il comportamento.

È come quando prendi una ricetta di famiglia e la modifichi per farla “a modo tuo”.

Esempio Java

class Animale {
    void verso() {
        System.out.println("Un animale fa un verso generico.");
    }
}

class Cane extends Animale {
    @Override
    void verso() {
        System.out.println("Il cane abbaia: Bau!");
    }
}

Conclusione

Capire gerarchie, ereditarietà, interfacce, overload e override significa capire il cuore dell’OOP in Java.
Non sono concetti astratti: li usiamo continuamente per modellare il mondo reale all’interno dei programmi.