Durante la fase di analisi e progettazione del software capita spesso di notare delle similitudini tra classi: due o più classi hanno dei campi e dei metodi in comune.
Nasce quindi la necessità di avere una classe “padre”, in cui mettere le proprietà in comune, da cui far “discendere” le altre classi.
Questo meccanisco, nel paradigma di programmazione orientato ad oggetti, è noto come ereditarietà.
Si dice che una classe A è una sottoclasse di B (e analogamente che B è una superclasse di A) quando A eredita da B sia i suoi che campi che i suoi metodi.
A si può anche chiamare classe base (o classe padre) e B classe derivata (o classe figlia).
La classe derivata, oltre i campi e i metodi della classe case, può anche aggiungere altri campi e metodi.
In Java, il meccanismo dell’ereditarietà viene realizzato tramite la parola chiave extends, seguita dal nome della classe, inserita nella dichiarazione della classe
public class B extends A{ }
Esempio
class A { String cognome; String nome; public void hello() { } } public class B extends A { int count; public void ciao() { } }
La classe B ha tutto quello che è stato definito in A (i campi nome, cognome e il metodo hello) più il campo count e il metodo ciao.
Una classe padre può avere più classi figli. Qui A può essere il padre della classe B, ma anche di una eventuale classe C.
Una classe figlio può avere solo una classe padre. In altre parole una classe non può estendere più di una classe.
Costruttori Classe Derivata
Una nota speciale merita il costruttore della classe derivata.
Una classe derivata ha i suoi costruttori e non eredita nessun costruttore dalle superclassi che estende.
Quando si crea un’istanza di una classe derivata, occorre costruire l’oggetto base e di solito, è il compilatore a chiamare automaticamente il costruttore di default della classe base.
Qualora avessimo necessità di richiamare un costruttore specifico, o non esiste quello di default, della classe base si può usare la parola chiave super(…..) per richiamarlo in modo esplicito. Notare che super(..) deve essere la prima istruzione del costruttore della classe figlia, altrimenti ci viene segnato come errore di compilazione.
Esempio
class A { String cognome; String nome; public void hello() { } A(String c, String n){ cognome = c; nome = n; } } public class B extends A { int count; B(int c, String cg, String n){ super(cg,n);// DEVE ESSERE LA PRIMA ISTRUZIONE DEL COSTRUT-TORE count = c; } public void ciao() { } }