Wie man Polymorphismus in Java beherrscht – Polymorphismus verstehen

Das Verständnis des Konzepts des Polymorphismus ist der Schlüssel zur Beherrschung der Programmiersprache Java. Allerdings kann das Konzept knifflig sein. Wie lässt sich das Konzept des Polymorphismus am besten verstehen und wie kann man es auf unsere Java-Programmierung anwenden?

Der Ursprung des Polymorphismus

Der Ursprung des Polymorphismus

Der vielleicht beste Weg, die Definition von Polymorphismus in Java zu verstehen, besteht darin, die einfache englische Definition des Wortes zu untersuchen. Polymorphismus ist der Akt der Polymorphie, der darin besteht, viele oder verschiedene Stadien, Formen oder Ähnliches zu durchlaufen. Wir wissen also, dass Polymorphismus im typischen englischen Sprachgebrauch der Akt der Veränderung ist – die Fähigkeit, viele verschiedene Stadien oder Formen zu durchlaufen, einige möglicherweise gleichzeitig. Dies gibt uns einen Hinweis darauf, was Polymorphismus in Java bedeutet, befriedigt jedoch nicht vollständig unser Bedürfnis nach einer Definition.

Der nächste Schritt könnte darin bestehen, die Verwendung des Wortes in anderen MINT-Bereichen zu untersuchen, beispielsweise in der Biologie. Die biologische Definition ähnelt der oben aufgeführten Definition – listet die biologische Definition von Polymorphismus als „die Existenz eines Organismus in mehreren Form- oder Farbvarianten“ auf. In der Kristallographie wird Polymorphismus als Kristallisation in zwei oder mehr chemisch identische, aber kristallographisch unterschiedliche Formen definiert, was der Definition, die wir für Java suchen, vielleicht etwas näher zu sein scheint. In der Genetik schließlich ist die Definition von Polymorphismus das Vorhandensein von zwei oder mehr unterschiedlichen Phänotypen in einer Population aufgrund der Expression verschiedener Allele eines bestimmten Gens, wie z. B. menschliche Blutgruppen O, A, B und AB. Obwohl dies weit von der Welt des Polymorphismus in Java und Computern entfernt zu sein scheint, finden wir hier wieder die Idee verschiedener „Varietäten“ (in diesem Fall Blutgruppen) desselben „Objekts“ (in diesem Fall Blut).

Zumindest in der Biologie und der „realen“ Welt wissen wir also, dass Polymorphismus mit mehreren Formen desselben Objekts zu tun hat. Allerdings sind die Definition des Wortes und die Anwendung der dahinter stehenden Konzepte in Java etwas anders (und schwieriger). Um den Polymorphismus in Java zu verstehen, müssen Sie zunächst verstehen, dass Java eine objektorientierte Programmierung ist.

Eine kurze Zusammenfassung der objektorientierten Programmierung

Objekt orientierte Programmierung

Im Gegensatz zu einigen anderen Programmiersprachen ist Java eine objektorientierte Sprache. Diese Eigenschaft bedeutet, dass die gesamte Programmierung in Java darin besteht, Objekte mit Attributen zu erstellen und diesen Objekten Verhaltensweisen (sogenannte Methoden) zuzuweisen. Andere Programmierarten wie BASIC und PASCAL gelten als prozedurorientierte Programmierung. Die prozedurorientierte Programmierung konzentriert sich auf schriftliche Befehlssätze zur Erfüllung von Aufgaben. Der Begriff „Unterprogramme“ wird häufig mit der prozedurorientierten Programmierung in Verbindung gebracht, und obwohl diese Art der Programmierung immer noch Anhänger hat, wird sie im Allgemeinen als weniger modern und daher weniger beliebt angesehen.

Wie viele objektorientierte Programmiersprachen ermöglicht Java auch die Vererbung, bei der übergeordnete Objekte (auch als Oberklasse von Objekten bezeichnet) Attribute an ihre untergeordneten Objekte weitergeben können. Der Programmierer kann die Attribute eines Objekts mithilfe eines IS-A-Tests bestimmen. Auch wenn dieser Test kompliziert klingt, ist er eigentlich ganz einfach. Wenn der Programmierer beispielsweise ein Tierobjekt als übergeordnetes Objekt und ein Katzenobjekt als untergeordnetes Objekt erstellt, kann der Programmierer die Beziehung einfach testen, indem er prüft, ob das Katzenobjekt ein Tierobjekt ist. In diesem Fall wäre dies der Fall, und so ist die Beziehung bestätigt.

Aber wie wirkt sich Polymorphismus in Java auf diese Verfahren aus? Nun, es ist einfach. Ein Java-Objekt ist polymorph, wenn es den IS-A-Test für mehr als mehr Klassen besteht. Das oben aufgeführte Katzenobjekt ist beispielsweise polymorph. Das Katzenobjekt ist ein Tierobjekt und es ist auch ein Katzenobjekt. Das Katzenobjekt fällt in zwei verschiedene Kategorien und ist daher ein Beispiel für Polymorphismus in Java.

Verwendung von Polymorphismus in Java

Verwendung von Polymorphismus in Java

„Moment mal!“, mögen einige der geschickteren unter unseren Lesern sagen. Das bedeutet, dass JEDES Objekt in Java Polymorphismus aufweist, da alle Objekte als ihr Typ und als ihr Klassenobjekt existieren. Das ist laut Tutorialspoint.com richtig. Alle Objekte in Java sind polymorph. Wenn Sie also ein Array als Objekt in der Klasse „Cool Array“ erstellen, bestätigt der IS-A-Test, dass das Objekt ein Array (als Typ) ist, und bestätigt auch, dass das Array ein Mitglied der „Cool Array“-Klasse ist. Cool Array“-Klasse.

In der Praxis kann diese Funktionalität von Java-Objekten sehr nützlich sein. In unserem Katzenbeispiel müsste der Programmierer nicht alle Tierattribute neu kodieren. Aufgrund der Vererbung und des Polymorphismus in Java würde das Cat-Objekt einfach alle Tierattribute erben, ohne dass weitere Arbeiten erforderlich wären. Auch hier ist das Katzenobjekt ein Tierobjekt und es ist ein Katzenobjekt. Aber nehmen wir an, der Programmierer wollte innerhalb dieses Rahmens eine „Unterart“ der Katze erschaffen? Was würde der Programmierer dann tun?

Auch hier ist die Antwort einfach. Der Programmierer sollte einfach die Klasse der Katze beispielsweise auf „Bergkatze“ erweitern und dann die Attribute auflisten, die der Programmierer der Katze wünscht. Wenn der Programmierer beispielsweise wünscht, dass das Objekt „Bergkatze“ große Schnurrhaare hat, kann er ihm einfach solche zuweisen. Noch besser: Aufgrund der Vererbung und des Polymorphismus verfügt die Klassenerweiterung „Mountain Cat“ über alle Attribute sowohl der Animal-Klasse als auch der „Cat-Klasse“. Die Bergkatzenklassenerweiterung IS-A-Tierklasse und IS-A-Katzenklasse.

Überschreiben in Java – ein kurzer Blick

Überschreiben in Java – ein kurzer Blick

Was passiert jedoch, wenn die übergeordnete Klasse bereits ein Attribut hat, das der Programmierer ändern möchte? Wenn beispielsweise in der Klasse „Katze“ bereits kurze Schnurrhaare als Attribut aufgeführt sind, wie könnte die Klassenerweiterung „Bergkatze“ stattdessen lange Schnurrhaare haben? Die Antwort ist einfach. Wenn das Attribut einer übergeordneten Klasse mit dem Attribut einer untergeordneten Klasse in Konflikt gerät, überschreibt das Attribut des untergeordneten Objekts das Attribut der übergeordneten Klasse. Dieser Vorgang wird als Overriding bezeichnet und vom Java-Compiler zur Laufzeit ermittelt.

Wie einige Leser vielleicht bereits wissen, ist Java eine kompilierte Sprache, was bedeutet, dass ein in dieser Sprache geschriebenes Programm einen Interpreter durchlaufen muss, der Java in einen Maschinencode übersetzt. Andere Sprachen wie Python interpretieren, während das Programm ausgeführt wird. Das Überschreiben erfolgt, NACHDEM das Programm kompiliert wurde. Daher wird das Verfahren als dynamisch (oder spätes Binden) bezeichnet. Das Überschreiben ist nicht der einzige Fall einer dynamischen Bindung, aber einer der häufigsten. Alle Instanzen der dynamischen Bindung finden zur Laufzeit statt – während das Programm ausgeführt wird. Diese Funktion definiert die dynamische (oder späte) Bindung.

Nur eine kurze Erinnerung: Obwohl technisch gesehen alle Java-Methoden virtuell sind (das heißt, sie können geändert werden), bis sie als endgültig gekennzeichnet werden, ist die Verwendung dynamischer Bindung (auch als spät bezeichnet) wahrscheinlich die beste Lösung für die Emulation der virtuellen Methode von C. Diese Funktionalität konnte nur durch die Möglichkeiten des Polymorphismus in Java ermöglicht werden.

Überladung in Java – Eine Zusammenfassung

Überladung in Java

Während das Überschreiben intuitiv sein mag, ist das Konzept des Überladens für den beginnenden Java-Programmierer möglicherweise nicht ganz so einfach. Eine Überladung kann nur stattfinden, wenn ein Objekt mehrere Methoden enthält. Der Compiler identifiziert jede Methode innerhalb des Objekts anhand ihrer Methodensignatur, bei der es sich um den Namen und die Parameterliste der Methode handelt. Selbst wenn der Methodenname bei mehreren Methoden gleich ist, wird diese Technik erfolgreich abgeschlossen, solange die Parameter für jede Methode unterschiedlich sind.

Sofern oben nicht anders angegeben, wird das Programm, das die Überladung verwendet, normal typisiert und kompiliert. Während das Programm, das diese Technik verwendet, kompiliert wird, trifft der Compiler eine Entscheidung darüber, welche Methode verwendet werden soll, indem er die Werte in den Referenzvariablen mit den in der Methodensignatur aufgeführten Parametern vergleicht und eine entsprechende Auswahl trifft. Nachfolgend finden Sie ein Beispiel für diese Technik, modifiziert nach einem Beispiel von sitepoint.com.

Klasse DemoOverload{

public int add(int x, int y){ //Methode 1

gib x+y zurück;

}

public int add(int x, int y, int z){ //Methode 2

gib x+y+z zurück;

}

public int add(int w, int x, int y, int z){ //Methode 3

gib w+x+y+z zurück

}

Wenn der Codierer die oben aufgeführte Klasse wie folgt aufrufen würde: System.out.println(demo.add(2,3));, dann würde der Compiler Methode 1 wählen, da die Parameter mit den Referenzvariablen übereinstimmen. Wenn wir stattdessen die oben beschriebene Klasse mit System.out.println(demo.add(1,2,3,4)); aufrufen würden, würde Methode 3 aus demselben Grund aufgerufen.

Da diese Aktion während der Kompilierung stattfindet, wird diese Technik als Polymorphismus zur Kompilierungszeit oder als statische Bindung bezeichnet. Überladung ist das häufigste Beispiel für Polymorphismus zur Kompilierungszeit und unterliegt den folgenden Regeln. Die Rückgabetypen können für jede Methode unterschiedlich sein. Außerdem können für jede Methode unterschiedliche Ausnahmen ausgelöst werden, was nützlich sein kann. Schließlich können die unterschiedlichen Methoden unterschiedliche Zugriffsmodifikatoren haben. Es gibt andere Techniken, die Polymorphismus zur Kompilierungszeit (oder statische Bindung) verwenden, aber Überladung ist die häufigste und es ist nützlich, sie auf allen Programmierkenntnissen zu kennen.

Das Verständnis des Polymorphismus in Java ist für alle Programmierebenen der Schlüssel zum Erfolg in Java. Viele nützliche Techniken wie Überschreiben und Überladen ergeben sich aus der Beherrschung des Polymorphismus in Java – ohne Polymorphismus ist die Sprache objektiv schwächer. Während auch andere Sprachen Polymorphismus bieten, könnte man argumentieren, dass Polymorphismus in Java die erfolgreichste Implementierung ist. Die Implementierung des Polymorphismus in Java ist sowohl flexibel als auch leicht verständlich. Das Erlernen von Polymorphismus in Java sollte für die Weiterentwicklung der Java-Programmierkarriere eines Programmierers von unschätzbarem Wert sein.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen