Was ist der Unterschied zwischen dem Überladen einer Methode und dem Überschreiben in Java?

10

Was ist der Unterschied zwischen dem Überladen einer Methode und dem Überschreiben in Java?

Gibt es einen Unterschied in der Methodensignatur, dem Zugriffsspezifizierer, dem Rückgabetyp usw.?

user63948
quelle
3
In PHP hat Überladung eine ganz andere Bedeutung .
Lortabac

Antworten:

41

Um eine Methode mit einer neuen Methode zu überladen, sollte die neue Methode eine andere Signatur haben. Dh zwei überladene Methoden haben den gleichen Namen, aber unterschiedliche Parameter. Hier ist ein Beispiel für zwei überladene Methoden:

boolean isOdd(int number) { ... };
boolean isOdd(float number) { ... };

Basierend auf den Parametertypen wird die entsprechende Methode aufgerufen. Beachten Sie, dass das Ändern des Rückgabetyps nicht ausreicht (obwohl Sie dies zusätzlich tun können).

Wenn eine Methode überschrieben wird, hat die neue Methode dieselbe Signatur und ersetzt in einigen Fällen die überschriebene Methode. Hier ist ein Beispiel für eine überschriebene Methode:

public class A 
{
     public void someMethod() { ... }
}

public class B extends A
{
     public void someMethod() { ... }
}

Die Auswahl erfolgt basierend auf dem Objekttyp. Zum Beispiel,

A someA = new B();
someA.someMethod();

wird das someMethodvon anrufen B. Sie können (und sollten) die Annotation @Override hinzufügen:

public class B extends A
{
     @Override
     public void someMethod() { ... }
}

Wenn Sie nun versehentlich die Parameter in B ändern, werden Sie vom Compiler darüber informiert, dass Sie someMethod () nicht überschreiben, sondern überladen.

superM
quelle
@scarfridge, danke für die Bearbeitung. Ich habe seit Ewigkeiten nicht mehr mit Java programmiert und viel vergessen)))
superM
1
Vielen Dank, dass Sie die @ Override-Annotationen erwähnt haben und die Tatsache, dass nur unterschiedliche Rückgabetypen keine Methode überschreiben, sondern überladen.
Daniel Dinnyes
13

Überladen, Methoden haben den gleichen Namen, aber unterschiedliche Parameter.

Beim Überschreiben wird die in der Basisklasse angegebene Implementierung durch die in der Unterklasse ersetzt.

NimChimpsky
quelle
1
Bitte nicht bearbeiten / erweitern. Die Kürze ist Punkt.
NimChimpsky
7

Konzepte, nach denen Sie fragen, werden in Java-Tutorials behandelt.

Die Erklärung zum Überschreiben wird wie folgt gegeben:

Eine Instanzmethode in einer Unterklasse mit derselben Signatur (Name plus Nummer und Typ ihrer Parameter) und Rückgabetyp als Instanzmethode in der Oberklasse überschreibt die Methode der Oberklasse.

Die Fähigkeit einer Unterklasse, eine Methode zu überschreiben, ermöglicht es einer Klasse, von einer Oberklasse zu erben, deren Verhalten "nah genug" ist, und dann das Verhalten nach Bedarf zu ändern. Die überschreibende Methode hat denselben Namen, dieselbe Anzahl und denselben Typ von Parametern und denselben Rückgabetyp wie die überschriebene Methode. Eine überschreibende Methode kann auch einen Subtyp des Typs zurückgeben, der von der überschriebenen Methode zurückgegeben wird. Dies wird als kovarianter Rückgabetyp bezeichnet .

Wenn Sie eine Methode überschreiben, möchten Sie möglicherweise die @OverrideAnmerkung verwenden, die den Compiler anweist, dass Sie eine Methode in der Oberklasse überschreiben möchten . Wenn der Compiler aus irgendeinem Grund feststellt, dass die Methode in einer der Oberklassen nicht vorhanden ist, wird ein Fehler generiert. Weitere Informationen @Overridefinden Sie unter Anmerkungen ...

Das Überladen wird im Tutorial wie folgt erklärt:

Die Programmiersprache Java unterstützt das Überladen von Methoden, und Java kann zwischen Methoden mit unterschiedlichen Methodensignaturen unterscheiden. Dies bedeutet, dass Methoden innerhalb einer Klasse denselben Namen haben können, wenn sie unterschiedliche Parameterlisten haben (es gibt einige Qualifikationen dafür, die in der Lektion mit dem Titel "Schnittstellen und Vererbung" erläutert werden.

Angenommen, Sie haben eine Klasse, die Kalligraphie zum Zeichnen verschiedener Datentypen (Zeichenfolgen, Ganzzahlen usw.) verwenden kann und die eine Methode zum Zeichnen jedes Datentyps enthält. Es ist mühsam , einen neuen Namen für jede Methode, zum Beispiel zu verwenden, drawString, drawInteger, drawFloat, und so weiter. In der Programmiersprache Java können Sie für alle Zeichenmethoden denselben Namen verwenden, aber jeder Methode eine andere Argumentliste übergeben. Daher kann die Datenzeichnungsklasse vier benannte Methoden deklarieren draw, von denen jede eine andere Parameterliste hat ...

Überladene Methoden unterscheiden sich durch die Anzahl und den Typ der an die Methode übergebenen Argumente ...

Sie können nicht mehr als eine Methode mit demselben Namen und derselben Anzahl und Art von Argumenten deklarieren, da der Compiler sie nicht unterscheiden kann.

Der Compiler berücksichtigt bei der Unterscheidung von Methoden nicht den Rückgabetyp. Daher können Sie nicht zwei Methoden mit derselben Signatur deklarieren, selbst wenn sie einen anderen Rückgabetyp haben.


Hinweis: Überladene Methoden sollten sparsam verwendet werden, da sie den Code weniger lesbar machen können.


Die obige Erklärung für das Überladen erwähnt Qualifikationen, die in der Lektion mit dem Titel "Schnittstellen und Vererbung" erörtert wurden :

In einer Unterklasse können Sie die von der Oberklasse geerbten Methoden überladen. Solche überladenen Methoden verbergen oder überschreiben die Methoden der Oberklasse nicht - es handelt sich um neue Methoden, die nur für die Unterklasse gelten.

Mücke
quelle
2

Das Überladen einer Methode wird normalerweise definiert als "Bereitstellen mehrerer verfügbarer Methoden mit demselben Namen, die sich durch die Anzahl und Art der Ein- und Ausgänge unterscheiden". Das Konzept besteht normalerweise darin, dass Sie in der Lage sein möchten, dieselbe Grundoperation bei unterschiedlichen Eingabesätzen auszuführen: Sie können beispielsweise zwei beliebige Werte vom numerischen Typ "hinzufügen", es ist jedoch normalerweise wichtig, den genauen Typ zu kennen Der Wert ist so, dass Sie bestimmte Verhaltensweisen dieses Typs nutzen oder planen können. Als solches würden Sie eine Methode für jede Kombination von numerischen Typen (und / oder Sammlungen) definieren, die Sie unterstützen möchten. Alle diese Methoden haben den gleichen Namen, aber unterschiedliche "Signaturen"; zur Kompilierungszeit

Das Überschreiben einer Methode wird normalerweise definiert als "Bereitstellen einer anderen Implementierung in einer abgeleiteten Klasse einer Methode mit einer bestimmten in der Basisklasse definierten Signatur". Es gibt viele Gründe, eine Methode zu überschreiben. Praktisch allen ist gemeinsam, dass die abgeleitete Klasse über zusätzliche Kenntnisse darüber verfügt, was zu tun ist, was der Basisklasse nicht bekannt ist. In den meisten OO-Sprachen gibt es zwei Arten des Überschreibens. Überschreiben kann ersetzt die Basisklassenmethode, oder es kann erweiterndie Basisklassenmethode. Der Unterschied besteht normalerweise darin, dass eine abgeleitete Klasse, die eine Basisklassenimplementierung erweitert, die überschriebene Version der Methode der Basisklasse zu einem bestimmten Zeitpunkt während der Ausführung der überschreibenden Methode aufruft. Auf diese Weise können überschreibende Klassen allgemeine Bereiche der Operation, die in der Basisklasse enthalten sind, "wiederverwenden".

KeithS
quelle