Il polimorfismo nella programmazione ad oggetti si suddivide in overriding e overloading, andiamo subito a vedere di cosa si tratta.
Quando in java ereditiamo una classe ereditiamo anche tutti i suoi metodi. Volendo possiamo farne l’override, cioè riscriverli per cambiarne il comportamento e adattarlo alle nostre esigenze.
Tutte le classi di Java sono figlie di Object, i metodi che ereditiamo da questa classe sono equals() e toString(), il primo paragona due oggetti e ritorna true se sono uguali, mentre il secondo ritorna una rappresentazione in stringa del nostro oggetto.
Proviamo a farne l’override e scrivere le nostre implementazioni:
public class Prova {
private int numeroDiProva;
public Prova(int numeriDiProva){
this.numeroDiProva = numeroDiProva;
}
public double getNumeroDiProva(){
return numeroDiProva;
}
//override di Object.equals()
public boolean equals(Prova p) {
return this.numeroDiProva == p.getNumeroDiProva();
}
//override di Object.toString()
public double toString() {
return "Numero di Prova: " + numeroDiProva;
}
}
Adesso che abbiamo modificato il comportamento di questi due metodi proviamo ad eseguirli nel Main:
public class Main {
public static void main(String[] args) {
Prova p1 = new Prova(10);
Prova p2 = new Prova(10);
Prova p3 = new Prova(15);
if(p1.equals(p2)) System.out.println("P1 e P2 sono uguali!");
//Il metodo toString() viene chiamato automaticamente da System.out.println(), non serve specificarlo!
System.out.println("P1 -> " + P1);
System.out.println("P2 -> " +P2);
System.out.println("P3 -> " +P3);
}
}
P1 -> Numero di prova: 10
P2 -> Numero di prova: 10
P3 -> Numero di prova: 15
L’overloading ci permette invece di avere più versioni dello stesso metodo, con numero e tipo di parametri diverso. Vediamo un esempio:
public class Numero {
private double numero;
public Prova(double numero){
this.numeroDiProva = numeroDiProva;
}
public double getNumero(){
return numero;
}
// Qui ho quattro versioni diverse dello stesso metodo
public double somma(double n1){
return this.numero + n1;
}
public double somma(int n1){
return this.numero + n1;
}
public double somma(Numero n1){
return this.numero + n1.getNumero();
}
public double somma(double n1, double n2){
return this.numero + n1 + n2;
}
}
public class Main {
public static void main(String[] args) {
Prova n1 = new Numero(10);
Prova n2 = new Numero(20);
System.out.println(n1.somma(n2));
System.out.println(n1.somma(10));
System.out.println(n1.somma(20.5));
System.out.println(n1.somma(20, 30));
}
}