Ereditarietà
- #java
- #programmazione
- #ereditarieta
In questa lezione
1. Definizione di 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 il suo stato che il suo behavior (comportamento)
- e quindi un’istanza della classe A è utilizzabile in ogni parte del codice in cui sia possibile utilizzare una istanza della classe B.
Per esempio:
classDiagram
Persona --|> Studente : Inheritance
note for Persona "classe base"
note for Studente "classe derivata"
package ereditarieta;
// classe base
public class Persona {
// attributi della classe
private String nome;
private String cognome;
private String data_nascita;
// costruttore
// ...
// metodi della classe
// ...
}
// la classe Studente deriva da Persona
// => (ha accesso agli attributi e ai metodi protected e public).
public class Studente extends Persona {
// attributi della classe
private String matricola;
// costruttore
// ...
// metodi della classe
// ...
}
2. Visibilità
visibilità campi (dati/record) di una classe
public | protected | (default) | private | |
|---|---|---|---|---|
| nella classe in cui dichiarati | ✅ | ✅ | ✅ | ✅ |
| nello stesso package | ✅ | ✅ | ✅ | ❌ |
| nelle sottoclassi (anche se in package diversi) | ✅ | ✅ | ❌ | ❌ |
| all’esterno | ✅ | ❌ | ❌ | ❌ |
3. Classe Object
Tutte le classi sono derivate dalla classe Object (def. in java.lang)
graph BT Rettangolo --> Object Quadrato --> Rettangolo
Object contiene l’mplementazione di default di alcuni metodi, per esempio:
equals(Object)→ boolean- confronta i reference dei due oggetti (come ==).
toString()→ String- restituisce la stringa corrente al reference dell’oggetto di invocazione.
cone()→ Object- effettua una copia (superficiale) dell’oggetto di invocazione.
Questi attributi sono ereditati da tutte le classi, ma possono essere ridefinite.
4. Instanceof
In java è possibile determinare se un oggetto appartiene o no ad una classe con l’operatore instanceof
dovre:
- → oggetto;
- → classe;
restituisce:
- true → se l’oggetto è di tipo .
- false → altrimenti.
5. Esempio Completo
classDiagram
Rettangolo --|> Quadrato : Inheritance
class Rettangolo {
- base: int
- altezza: int
+ Rettangolo()
+ Rettangolo(int, int)
+ perimetro() int
+ area() int
+ getAltezza() int
+ getBase() int
}
class Quadrato{
+ Quadrato()
+ Quadrato(int)
+ circonferenza() double
+ perimetro() int
}
package Java.ereditarieta_esempio_completo;
// classe base
public class Rettangolo {
// attributi
private int base;
private int altezza;
// costruttore senza parametri
public Rettangolo() {
this.base = 0;
this.altezza = 0;
}
// costruttore con 2 parametri
public Rettangolo(int base, int altezza) {
this.base = base;
this.altezza = altezza;
}
// metodo
public int perimetro() {
return 2*base + 2*altezza;
}
// metodo
public int area() {
return base * altezza;
}
// metodi getter
public int getBase() {
return base;
}
public int getAltezza() {
return altezza;
}
}
package Java.ereditarieta_esempio_completo;
// classe derivata
public class Quadrato extends Rettangolo{
// in questo caso questa classe non ha attributi
// perchè già tutti contenuti nella classe base
// costruttore senza parametri
public Quadrato() {
super();
}
// costruttore con un parametro
public Quadrato(int lato){
super(lato, lato);
}
// metodo
public double circonferenza() {
return getAltezza()*3.14;
}
// metodo
public int perimetro() {
// invoca il metodo perimetro della classe base
return super.perimetro();
}
}
package Java.ereditarieta_esempio_completo;
public class Main {
public static void main(String[] args) {
Rettangolo r1 = new Rettangolo(5, 7);
Quadrato q1 = new Quadrato(4);
System.out.println(r1.area()); // area del rettangolo
System.out.println(q1.area()); // area del quadrato
System.out.println(r1 instanceof Rettangolo); // -> true
System.out.println(q1 instanceof Quadrato); // -> true
System.out.println(q1 instanceof Rettangolo); // -> true
System.out.println(r1 instanceof Quadrato); // -> false
System.out.println(q1 instanceof Object); // -> true
}
}
6. Quiz
Mettiti alla prova
0/10 risposte
Cos'è l'ereditarietà in Java?
Quale keyword permette di creare una sottoclasse?
La classe da cui si eredita si chiama:
Una sottoclasse può:
Quale keyword richiama il costruttore della superclasse?
Tutte le classi Java derivano implicitamente da:
L'operatore instanceof serve per:
Un oggetto Quadrato è anche un Rettangolo?
Quale visibilità permette accesso alle sottoclassi?
Ridefinire un metodo della superclasse si chiama:
7. Esercizi
Ereditarietà di classi in linguaggio Java:esercizi risolti
7.1 Ereditarietà base
Creare:
- una classe Veicolo
- una classe Auto che estende Veicolo
Classe Veicolo:
- attributi: marca, velocità
- metodo: stampaInfo()
Classe Auto:
- attributo: numeroPorte
Creare un Main che istanzia un oggetto Auto.
7.2 Uso di super
Creare una classe:
- Animale con attributo nome.
Creare una sottoclasse:
- Cane.
Requisiti:
- costruttore con parametro nome
- inizializzazione tramite super(…).
7.3 Override
Creare:
- classe Forma con metodo area().
- classi Cerchio e Rettangolo.
Ogni sottoclasse deve ridefinire il metodo area().
Stampare l’area usando variabili di tipo Forma.
7.4 Uso di instanceof
Dato un riferimento:
- Animale a = new Cane();
Verificare:
- se è un Cane
- se è un Animale
- se è un Object
7.5 Ereditarietà multilivello
Realizzare la gerarchia:
- Persona → Studente → StudenteUniversitario
Ogni classe deve aggiungere:
- almeno un attributo
- almeno un metodo.