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"
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
// ...
}
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 | ✅ | ❌ | ❌ | ❌ |
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
toString()
→ String
cone()
→ Object
Questi attributi sono ereditati da tutte le classi, ma possono essere ridefinite.
In java è possibile determinare se un oggetto appartiene o no ad una classe con l’operatore instanceof
dovre:
restituisce:
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
}
}