Home Insegnanti Contattami Portfolio

Ereditarietà

1️⃣ Definizione di ereditarietà

Si dice che una classe A è una sottoclasse di B (e analogamente che B è una superclasse di A) quando:

Per esempio:

classDiagram
    Persona --|> Studente : Inheritance
    
    note for Persona "classe base"
    note for Studente "classe derivata"
📖
un oggetto della classe Studente appartiene alla classe degli studenti e anche alla classe delle persone (ma non viceversa).

⇒ un oggetto Studente ha tutte le propietà (attributi e metodi) di Persona + eventuali altre sue personali propietà.

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’implementazione di default di alcuni metodi, per esempio:

Questi attributi sono ereditati da tutte le classi, ma possono essere ridefinite.

4️⃣ Instanceof

In java è possibile determinare se un oggetto oo appartiene o no ad una classe cc con l’operatore instanceof

o  instanceof  co \ \ instanceof \ \ c

dovre:

restituisce:

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
    }
}

📑 Esercizi

Ereditarietà di classi in linguaggio Java:esercizi risolti
Esercizi svolti ereditarietà e polimorfismo in linguaggio Java.
https://www.edutecnica.it/informatica/polimorfismo_x/polimorfismo_x.htm

QUIZ