Literatur

Polymorphie

Methoden können der sogenannten Polymorphie unterliegen. Polymorphie ist griechisch und bedeutet Vielgestaltigkeit. Von Polymorphie spricht man in Java beispielsweise, wenn  zwei Klassen denselben Methodennamen verwenden, aber die Implementierung der Methoden sich unterscheidet. Häufig wird Polymorphie bei der Vererbung verwendet, d. h., dass einer Variablen nicht nur Objekte vom Typ der bei der Deklaration angegebenen Klasse zugewiesen werden können, sondern auch Objekte vom Typ der Kindsklassen. Dies funktioniert nur, weil jede Kindsklasse auch alle Methoden und Attribute ihrer Elternklassen implementieren muss.

Somit ist gewährleistet, dass alle Kindsklassen über dieselben Methoden verfügen wie die Elternklasse. Die Methoden können jedoch unterschiedlich implementiert werden, man spricht hier vom "Überschreiben" der Methode.

Beispiel:

import java.io.*;
 
abstract class Stift
{     
    String schreibfarbe;
    public abstract void gebeSchreibfarbeAus();
}
 
class Kugelschreiber extends Stift
{     
    public Kugelschreiber ( String e )
    {
        schreibfarbe = e;
    }
 
    public void gebeSchreibfarbeAus ()
    {
        System.out.println("Schreibfarbe des Kugelschreibers  ist  " + schreibfarbe + ",\n");
    }
}
 
class Buntstift extends Stift
{     
    public Buntstift ( String e )
    {
        schreibfarbe = e;
    }
 
    public void gebeSchreibfarbeAus ()
    {
        System.out.println("Mein Buntstift hat die Schreibfarbe" + schreibfarbe + ",\n");
    }
}
 
public class StiftTester
{     
    public static void main ( String[] args ) throws IOException 
    {
        /* Kugelschreiber-Objekt wird einer Variablen, die auf ein Objekt der Elternklasse "Stift" zeigt, zugewiesen */
        Stift irgendeinStift = new Kugelschreiber( "blau" );
        /* Methode "gebeSchreibfarbeAus" der Klasse Kugelschreiber wird ausgeführt */
        irgendeinStift. gebeSchreibfarbeAus ();        
 
        /* Buntstift-Objekt wird einer Variablen, die auf ein Objekt der Elternklasse "Stift" zeigt, zugewiesen */
        irgendeinStift = new Buntstift ( "rot" );
        /* Methode "gebeSchreibfarbeAus" der Klasse Buntstift wird ausgeführt */
        irgendeinStift. gebeSchreibfarbeAus ();          
    }
}

Hier wird einer Variablen, die auf ein Objekt der Elternklasse "Stift" zeigt, Objekte der Unterklassen "Kugelschreiber" und "Buntstift" zugewiesen. Da alle Klassen die Methode "gebeSchreibfarbeAus" besitzen, ist der Aufruf der Methode "gebeSchreibfarbeAus" kein Problem. Die JVM weiß, welche Klasse sich hinter dem Objekt der Variablen "irgendeinStift" verbirgt. So wird jetzt immer die Methode "gebeSchreibfarbeAus" des Objektes der jeweiligen Unterklasse (also Bleistift oder Kugelschreiber) aufgerufen, aber nicht die der Klasse Stift.

Mit dem Aufruf von "irgendeinStift.getClass()" kann man sich die Klasse des Objektes „anschauen“, auf welches die Variable "irgendeinStift" zeigt:

System.out.println(irgendeinStift.getClass());

Falls für die Kindsklasse jedoch keine Änderung der Funktionalität erforderlich ist, kann auch die Implementation der Eltern-Methode übernommen werden, indem diese mit dem Schlüsselwort super (Referenz auf Instanz der Elternklasse) aufgerufen wird. Dies ist in dem obigen Beispiel jedoch nicht möglich, da dort die Methode der Elternklasse abstrakt ist, also noch nicht implementiert wurde.