Poliforfismo in Java

Il polimorfismo nella programmazione ad oggetti si suddivide in overriding e overloading, andiamo subito a vedere di cosa si tratta.

Overriding

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

Overloading

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));

    }
}