Java Ereditarietà

Da Andreabont's Wiki.

Il Java, essendo un linguaggio che segue solo il paradigma ad oggetti, vede l'ereditarietà uno dei fondamenti del linguaggio, pur ponendo dei forti limiti al programmatore.

Ereditarietà base

Java non dispone dell'ereditarietà multipla, quindi un oggetto può estendere una sola classe.

public class A {
    public String getString() {
        return "A";
    }
}
public class B extends A {
    public String getString() {
        return "B";
    }
}
public class Main {
    public static void main(String[] args) {
        B miaClasse = new B();
        System.out.println(miaClasse.getString());      // Chiamo metodo di B
        System.out.println(((A)miaClasse).getString()); // Chiamo metodo di A (Tramite cast!!!)
    }
}

Interfacce

Non disponendo dell'ereditarietà multipla, il Java fornisce una sintassi apposita per definire delle interfacce, che sarebbero delle classi astratte. Una classe può implementare tutte le interfacce che vuole. Con Java 8 le interfacce sono state modificate per permettere l'implementazione di metodi, purché questi non utilizzino lo stato interno della classe (che non esiste, essendo astratta) arrivando ad avere un abbozzo di ereditarietà multipla.

Base

public interface A {
    public String getString();
}
public class B implements A {
    public String getString() {
        return "B";
    }
}
public class Main {
    public static void main(String[] args) {
        B miaClasse = new B();
        System.out.println(miaClasse.getString());
    }
}

Virtual extension method

public interface A {
    default String getString() {
        return "A";
    }
}
public class B implements A {

}
public class Main {
    public static void main(String[] args) {
        B miaClasse = new B();
        System.out.println(miaClasse.getString());
    }
}