MORENO SARDELLA · RECUPERO JAVA
← Tutte le lezioni
Lezione 6

EREDITARIETA' E POLIMORFISMO

Riutilizzare il codice con extends, riscrivere i metodi con override, e trattare oggetti diversi in modo uniforme: toString, equals, instanceof, casting e polimorfismo.

01
Riutilizzare il codice

La parola extends

L'ereditarieta' permette a una classe (sottoclasse) di ereditare attributi e metodi di un'altra (superclasse) con extends. Si usa quando vale la relazione «e'-un»: un Cane e' un Animale.

eredita.java
class Animale {
    protected String nome;          // protected: visibile alle sottoclassi
    Animale(String n) { nome = n; }
    String verso() { return "..."; }
}

class Cane extends Animale {       // Cane eredita nome e verso()
    Cane(String n) { super(n); }   // super() chiama il costruttore della superclasse
}
02
Cambiare un comportamento

L'override

Una sottoclasse puo' riscrivere (override) un metodo ereditato per cambiarne il comportamento. Si annota con @Override.

class Cane extends Animale { Cane(String n) { super(n); } @Override String verso() { return "Bau"; } // riscrive il metodo }
03
Il cuore della verifica

Il polimorfismo

Il polimorfismo e' la capacita' di trattare oggetti di tipo diverso con un tipo comune. Posso mettere cani e gatti in un array di Animale: quando chiamo verso(), Java sceglie a runtime la versione giusta per ciascun oggetto.

polimorfismo.java
Animale[] zoo = { new Cane("Fido"), new Gatto("Tom") };

for (Animale a : zoo)
    System.out.println(a.verso());   // Bau, poi Miao: ognuno il suo!
OutputBau Miao

E' esattamente cio' che chiede la verifica: un array di Pagabile[] o Misurabile[] scorso in modo polimorfico, dove ogni oggetto calcola il proprio importo a modo suo.

04
Metodi utili da conoscere

toString, equals, instanceof

@Override public boolean equals(Object o) { if (!(o instanceof Persona)) return false; Persona p = (Persona) o; // casting return this.nome.equals(p.nome); }
01
Gerarchia Forma

Superclasse astratta Forma con metodo astratto area(); sottoclassi Cerchio e Quadrato. Somma le aree di un array di Forma.

Mostra soluzione
abstract class Forma { abstract double area(); } class Cerchio extends Forma { double r; Cerchio(double r){ this.r = r; } double area(){ return Math.PI*r*r; } } class Quadrato extends Forma { double l; Quadrato(double l){ this.l = l; } double area(){ return l*l; } } // double tot = 0; for (Forma f : forme) tot += f.area();

Esercizi su ereditarieta' e polimorfismo ↓

Ereditarieta' - Esercizi basescarica ↓
Ereditarieta' - Esercizi avanzatiscarica ↓