Polymorphismus in Java: Konzepte, Typen, Eigenschaften und Beispiele
Veröffentlicht: 2022-04-18Javascript ist neben C#, PHP, Python, C++ usw. eine der beliebtesten und am weitesten verbreiteten objektorientierten Programmiersprachen. Es ermöglicht Benutzern, Konzepte aus dem wirklichen Leben durch Programmierung darzustellen und anzusprechen, da alles als Objekt dargestellt wird. Die Funktionen von Java als Programmiersprache bieten mehrere Möglichkeiten, die Softwareentwicklung zu vereinfachen, indem sie die Codes dynamischer gestalten und die Wartung vereinfachen.
In diesem Artikel werden wir Java als objektorientierte Programmiersprache untersuchen und die Konzepte der Vererbung, Abstraktion, Polymorphie und Datenkapselung verstehen. Wir werden uns auch mit den Arten von Polymorphismus in Java, ihren Vor- und Nachteilen befassen.
Überblick über die objektorientierte Programmierung
Objektorientierte Programmiersprachen (OOP) beziehen sich auf jene Computersprachen, die das Konzept von Echtzeit-„Objekten“ beim Codieren verwenden. Es zielt darauf ab, weltliche Entitäten wie Vererbung, Polymorphismus, Schleifen, Datenabstraktion usw. durch Programmierung zu implementieren.
Es gibt einige grundlegende Konzepte der objektorientierten Programmierung, mit denen sich Programmierer vertraut machen müssen. Diese konzeptionellen Begriffe sind notwendig, um etwas über spezielle und einzigartige Merkmale von OOP wie Kapselung, Polymorphismus usw. zu lernen.
1. Klasse
Eine „Klasse“ stellt einen Satz von Eigenschaften und Methoden dar, die für alle spezifizierten „Objekte“ innerhalb der Klasse gelten. Die Objekte können unterschiedlichen Typs sein, wie Integer, Array oder String etc. Eine Klasse ist wie ein vom Benutzer definierter Prototyp, mit dem verschiedene „Objekte“ erstellt werden können.
2. Objekt
Ein Objekt ist die grundlegendste Einheit von OOP-Sprachen und repräsentiert echte Daten im wirklichen Leben. Objekte tragen die Eigenschaften der Klasse(n), in der sie aufgerufen werden.
3. Methode
Eine Methode ist eine Menge von Anweisungen, die verschiedene Funktionen umfassen, die zusammengestellt werden, um eine bestimmte Aufgabe auszuführen. Es gibt die Ausgabe zurück, nachdem die vom Benutzer definierten Anweisungen ausgeführt wurden. Es kann auch Aufgaben ausführen, die keine Ausgabe liefern. Methoden ermöglichen es Programmierern, die Codes wiederzuverwenden, ohne sie erneut eingeben zu müssen. Java erfordert, dass alle Methoden zu einer Klasse gehören, im Gegensatz zu Sprachen wie C++, C oder Python.
OOP-Konzepte
Es gibt vier Hauptprinzipien der objektorientierten Programmierung – Java weist alle diese Eigenschaften auf:
1. Abstraktion
Datenabstraktion ist eine Eigenschaft von OOP-Sprachen, die die notwendigen Details darstellt, während andere irrelevante Details des Objekts für den Benutzer nicht sichtbar sind, wie z. B. der Implementierungscode. Nur die wesentlichen und relevanten Details werden von dieser Funktion angezeigt, was Entwicklern hilft, schnell geeignete Änderungen an der Funktionalität einer Klasse vorzunehmen.
2. Kapselung
Datenkapselung bezieht sich auf das Verpacken von Daten innerhalb von Einheiten. Diese Eigenschaft von OOP-Sprachen schützt die gekapselten Daten vor anderen Funktionen und Methoden. Es bindet den Code und die angegebenen Methoden zusammen, um Operationen in einzelnen Einheiten auszuführen, und verhindert so, dass sie manipuliert oder von externen Methoden aufgerufen werden. Dies wird auch als Datenverbergung bezeichnet.
3. Erbschaft
Vererbung ist ein weiteres wichtiges Merkmal von OOP-Sprachen, das es einer Klasse ermöglicht, Eigenschaften von anderen Klassen zu erben. Es arbeitet nach dem Konzept der Wiederverwendbarkeit von Codes und reduziert dadurch die Notwendigkeit, Klassenmerkmale wiederholt neu einzugeben. Die Klasse, die von einer anderen Klasse erbt, wird als Unterklasse bezeichnet, und die geerbte Klasse wird als Oberklasse bezeichnet.
4. Polymorphismus
Polymorphismus ermöglicht es einem Objekt, viele Formen anzunehmen und ähnliche Aufgaben auszuführen oder ähnliche Verhaltensweisen in verschiedenen Methoden zu zeigen.
Polymorphismus in Java
Polymorphismus ermöglicht es, eine einzelne Aufgabe auf verschiedene Weise auszuführen. Es ist eine Eigenschaft, die dabei hilft, ähnliche Codeentitäten zu identifizieren und zwischen ihnen zu unterscheiden, wodurch die Effizienz der OOP-Sprachen verbessert wird.
In Java wird Polymorphismus gezeigt, indem Objekte als separate Entitäten deklariert werden. Auf diese Weise kann dieselbe Aktion auf mehrere Arten ausgeführt werden. Zusammen mit der Vererbung wird der Polymorphismus aktiviert, wodurch die Objekte unter Verwendung der geerbten Eigenschaften verschiedener Klassen unterschiedliche Aufgaben ausführen können. Unterschiede in der Bezeichnung von Methoden oder Objekten unterscheiden zwei Entitäten.
Lernen Sie Softwareentwicklungskurse online von den besten Universitäten der Welt. Verdienen Sie Executive PG-Programme, Advanced Certificate-Programme oder Master-Programme, um Ihre Karriere zu beschleunigen.
Merkmale des Polymorphismus
1. Zwang
Die implizite Konvertierung von Datentypen zur Vermeidung von Typfehlern während der Kompilierzeit ist eine Zwangsmaßnahme. Es enthält keine expliziten Datentypkonvertierungen, sondern folgt nur der Konvertierungshierarchie, die Java zulässt. Wenn beispielsweise ein Operand flott und der Operator eine Ganzzahl ist, ist das Ergebnis flott.
2. Polymorphe Parameter/Variablen
Ein Objekt oder eine Variable, die während der Ausführungszeit Werte verschiedener Typen enthalten kann, wird als polymorphe Variable oder Parameter bezeichnet. Es schreibt vor, dass beim Deklarieren einer Klasse dieselben Variablennamen unterschiedliche Datentypen enthalten können und dieselben Methodennamen unterschiedliche Parameter und Rückgabetypen enthalten können.
3. Interne Operatorüberladung
Beim Überladen von Operatoren wird ein Operatorsymbol nach Bedarf des Benutzers verwendet. Java unterstützt das Überladen von internen Operatoren. Es ist auch ein Beispiel für statischen Polymorphismus.
Arten von Polymorphismus in Java
In Java kann Polymorphismus aufgerufen werden mit:
1. Methodenüberladung
Das Überladen von Methoden ist der Vorgang, bei dem mehrere Objekte oder Methoden mit demselben Namen und derselben Klasse erstellt werden. Es funktioniert innerhalb einer Klasse.
2. Methodenüberschreibung
Das Überschreiben von Methoden ist, wie eine Unterklasse die gleichen Methoden bildet, die in der Oberklasse deklariert sind. Es funktioniert klassenübergreifend. Wenn die Unterklasse dieselben Methoden enthält, die bereits in der Oberklasse vorhanden sind, wird die Funktion in der Unterklasse überschrieben.
Subtyp-Polymorphismus in Java
Subtyp-Polymorphismus hängt von Upcasting und Late Binding ab.
- Upcasting ist ein Prozess, bei dem ein Objekt oder eine Methode einen Datentyp (Float, Integer usw.) von einem Subtyp zu einem Supertyp hochstufen kann, indem es ihn in der Vererbungshierarchie nach oben verschiebt.
- Die späte Bindung wird verwendet, um Methoden aufzurufen, die nicht finale Instanzen sind.
Daran ist kein Operator beteiligt, da der Subtyp selbst ein Mitglied des Supertyps ist. Wenn beispielsweise eine Klasse Farben heißt, können ihre Untertypen rot, blau, orange, grün usw. sein. Der Untertyp-Polymorphismus umfasst die Untertypen, um die Eigenschaften des Obertyps aufzuweisen. Der Zugriff auf einzelne Eigenschaften jedes Untertyps geht jedoch verloren.
Laufzeitpolymorphismus in Java
In Java ist Laufzeitpolymorphismus auch als Dynamic Method Dispatch oder Dynamic Binding bekannt. Dies wird durch Überschreiben von Methoden erreicht – Aufrufen einer überschriebenen Methode, um eine dynamische Auflösung zur Laufzeit bereitzustellen. Es kann durch Funktionen und nicht durch Objekte erreicht werden.
Hier ist ein Beispiel für Laufzeitpolymorphismus in Java:
Klasse Auto{
void run(){System.out.println("fahren");}
}
Klasse Volkswagen erweitert Auto{
void run(){System.out.println(“Sicher fahren mit 90km“);}
public static void main(String args[]){
Auto c = neuer Volkswagen();//upcasting
b.run();
}
}
Ausgang :
Sicher fahren mit 90km
Kompilierzeit-Polymorphismus in Java
Polymorphismus zur Kompilierzeit wird durch Überladen von Methoden erreicht. Es ist der Prozess, bei dem der Aufruf einer überladenen Methode während der Kompilierzeit ausgeführt und aufgelöst wird. Es wird auch als statischer Polymorphismus bezeichnet. Java ist flexibel genug, um es dem Benutzer zu ermöglichen, Methoden oder Objekte mit denselben Namen zu verwenden, solange seine Deklarationen und Signatureigenschaften unterschiedlich bleiben.
Hier ist ein Beispiel für Polymorphismus zur Kompilierzeit in Java:
Klasse SimpleCalc
{
int add(int x, int y)
{
gib x+y zurück;
}
int add(int x, int y, int z)
{
gib x+y+z zurück;
}
}
öffentliche Klasse Demo
{
public static void main(String args[])
{
SimpleCalc obj = new SimpleCalc();
System.out.println (obj.add (20, 30));
System.out.println (obj.add (40, 30, 20));
}
}
Ausgang :
50
90
Bedeutung des Polymorphismus
Polymorphismus ermöglicht das Schreiben von Methoden, die verschiedene Arten von Entitäten mit demselben Namen darstellen können. Polymorphismus ist in Java aufgrund seiner verschiedenen Verwendungsvorteile und des Umfangs, den er bietet, um den Code dynamisch zu machen, unerlässlich:
- Es ermöglicht die Wiederverwendbarkeit von Codes – dieselben Codes müssen nicht mehrmals geschrieben werden.
- Dadurch kann eine Variable mehrere Verhaltensweisen aufweisen – denselben Namen, aber unterschiedliche Eigenschaften zu haben, kann Spielraum für die Aufrechterhaltung der Konsistenz in Codes eröffnen.
- Reduzierung von Massencodes – es hilft beim Debuggen und verkürzt gleichzeitig die Kompilierzeit, wodurch Speicher, Energie und Zeit des Benutzers gespart werden.
Mögliche Probleme bei der Implementierung von Polymorphismus
Die Verwendung und Implementierung von Polymorphismus kann verwirrend sein. Es verringert die Lesbarkeit von Codes und birgt daher die Gefahr mehrerer Fehler und Fehler. Es schafft auch Probleme mit der Durchführung von Funktionen nach Bedarf.
Es gibt ein klassisches Problem, auf das Sie achten sollten: Das Fragile-Base-Class-Problem. Es bezieht sich auf die unsachgemäße Zusammenstellung und Codierung einer geerbten Klasse, die zu Methoden führt, die unvorhersehbare Ergebnisse zeigen.
Schlussfolgerungen
Die fragile Natur der Vererbung kann zu dysfunktionalen und gebrochenen Codes führen, obwohl alle anderen Kriterien erfüllt bleiben. Dieses grundlegende Architekturproblem wird als Problem der fragilen Basisklasse angesehen. Erfahren Sie mehr darüber, wie Java OOP-Konzepte zeigt, indem Sie dem Executive PG Program in Software Development – Specialization in Full Stack Development von upGrad beitreten . Lassen Sie sich von Branchenexperten beraten und bauen Sie praktisches Wissen auf, indem Sie sich an praktischen, kollaborativen Projekten mit Kollegen beteiligen.
Buchen Sie noch heute Ihren Platz!
Was ist statische und dynamische Bindung?
Objekte, die zum Zeitpunkt der Kompilierung festgelegt werden, werden als statische Bindung bezeichnet. Andererseits werden dynamische Bindungstypen von Objekten zur Laufzeit bestimmt. Ersteres wird beim Überladen von Methoden und letzteres beim Überschreiben von Methoden verwendet.
Was sind die beiden grundlegenden Unterschiede zwischen Methodenüberschreibung und Methodenüberladung?
In Java überschreibt das Überschreiben von Methoden keine statischen, privaten und finalen Methoden, während das Überladen von Methoden statische, private und finale Methoden in Java überlädt. Außerdem durchlaufen überschreibende Methoden eine dynamische Bindung und überladene Methoden eine statische Bindung.
Was sind die Unterschiede zwischen Polymorphismus und Vererbung in Java?
In Java gibt es mehrere Unterschiede zwischen Polymorphismus und Vererbung:
1. Vererbung ist eine Darstellung der realen Eltern-Kind-Beziehung in der Codierung. Aber Polymorphismus ist ein Katalysator, der diese Beziehung nutzt, um das Programm dynamischer zu machen.
2. Vererbung ermöglicht die Wiederverwendbarkeit von Codes aus der untergeordneten Klasse, indem dieselben von der übergeordneten Klasse geerbt werden. Im Gegensatz dazu ermöglicht Polymorphismus der untergeordneten Klasse, ihr vorhandenes Verhalten innerhalb der übergeordneten Klasse erneut zu definieren.