580 Stimmen

Warum erlaubt Java keine Überschreibung statischer Methoden?

Warum ist es nicht möglich, statische Methoden außer Kraft zu setzen?

Wenn möglich, verwenden Sie bitte ein Beispiel.

3 Stimmen

Die meisten OOP-Sprachen lassen dies nicht zu.

11 Stimmen

@jmucchiello: siehe meine Antwort. Ich habe dasselbe gedacht wie Sie, aber dann habe ich von den Ruby/Smalltalk-"Klassen"-Methoden erfahren, und es gibt also auch andere echte OOP-Sprachen, die das tun.

6 Stimmen

@jmucchiello die meisten OOP-Sprachen sind keine echten OOP-Sprachen (ich denke an Smalltalk)

5voto

Lars Punkte 1377

Im Allgemeinen ist es nicht sinnvoll, das "Überschreiben" statischer Methoden zuzulassen, da es keine gute Möglichkeit gäbe, zur Laufzeit zu bestimmen, welche Methode aufgerufen werden soll. Nehmen wir das Employee-Beispiel: Wenn wir RegularEmployee.getBonusMultiplier() aufrufen - welche Methode soll dann ausgeführt werden?

Im Falle von Java könnte man sich eine Sprachdefinition vorstellen, bei der es möglich ist, statische Methoden zu "überschreiben", solange sie durch eine Objektinstanz aufgerufen werden. Dies würde jedoch nur dazu führen, dass reguläre Klassenmethoden neu implementiert werden, was der Sprache Redundanz verleiht, ohne wirklich einen Nutzen zu bringen.

2 Stimmen

Intuitiv würde ich denken, dass es genau wie eine virtuelle Funktion funktionieren sollte. Wenn B A erweitert und sowohl A als auch B virtuelle Funktionen namens doStuff haben, weiß der Compiler, dass Instanzen von A A.doStuff und Instanzen von B B.doStuff verwenden sollten. Warum kann er das nicht auch mit statischen Funktionen tun? Schließlich weiß der Compiler, von welcher Klasse jedes Objekt eine Instanz ist.

0 Stimmen

Ähm ... Jay, eine statische Methode muss nicht auf einer Instanz aufgerufen werden (wird im Allgemeinen nicht) ...

2 Stimmen

@meriton, aber dann ist es noch einfacher, oder? Wenn eine statische Methode über einen Klassennamen aufgerufen wird, verwenden Sie die für die Klasse geeignete Methode.

5voto

Arnab Punkte 374

Durch Überschreiben können wir eine polymorphe Natur in Abhängigkeit vom Objekttyp schaffen. Eine statische Methode hat keinen Bezug zum Objekt. Daher kann Java keine statischen Methodenüberschreibungen unterstützen.

5voto

user1923551 Punkte 4506

Durch Überschreiben erreichen Sie dynamische Polymorphie. Wenn Sie sagen, dass Sie statische Methoden überschreiben, sind die Worte, die Sie zu verwenden versuchen, widersprüchlich.

Static sagt - Kompilierzeit, Overriding wird für dynamische Polymorphie verwendet. Beide sind von Natur aus gegensätzlich und können daher nicht zusammen verwendet werden.

Dynamisches polymorphes Verhalten entsteht, wenn ein Programmierer ein Objekt verwendet und auf eine Instanzmethode zugreift. JRE bildet verschiedene Instanzmethoden verschiedener Klassen ab, je nachdem, welche Art von Objekt Sie verwenden.

Wenn Sie sagen, dass Sie statische Methoden überschreiben, dann greifen wir auf statische Methoden zu, indem wir den Klassennamen verwenden, der zur Kompilierzeit verknüpft wird, es gibt also kein Konzept für die Verknüpfung von Methoden zur Laufzeit mit statischen Methoden. Der Begriff "Overriding" statischer Methoden selbst hat also keine Bedeutung.

Hinweis: Selbst wenn Sie mit einem Objekt auf eine Klassenmethode zugreifen, ist der Java-Compiler intelligent genug, um dies herauszufinden, und führt eine statische Verknüpfung durch.

0 Stimmen

Dies ist in vielen Fällen nicht der Fall, in denen die statische Methode zur Laufzeit tatsächlich von einer Instanz der enthaltenden Klasse aufgerufen wird und es daher durchaus möglich ist, zu bestimmen, welche Instanzen der Funktion aufgerufen werden sollen.

0 Stimmen

Statisch bedeutet nicht Kompilierzeit, statisch bedeutet, dass es an eine Klasse und nicht an ein bestimmtes Objekt gebunden ist. Es macht genauso viel, wenn nicht sogar mehr Sinn als die Erstellung einer Klassenfabrik, außer statisch Box.createBox macht mehr Sinn als BoxFactory.createBox und ist ein unvermeidbares Muster, wenn eine Konstruktion auf Fehler geprüft werden muss, ohne dass Ausnahmen ausgelöst werden (Konstruktoren können nicht fehlschlagen, sie können nur den Prozess beenden/eine Ausnahme auslösen), wohingegen eine statische Methode bei einem Fehlschlag null zurückgeben oder sogar Erfolgs-/Fehlerrückrufe akzeptieren kann, um etwas zu schreiben wie hastebin.com/codajahati.java .

5voto

Athens Holloway Punkte 2143

Das Überschreiben ist Instanzmitgliedern vorbehalten, um polymorphes Verhalten zu unterstützen. Statische Klassenmitglieder gehören nicht zu einer bestimmten Instanz. Stattdessen gehören statische Mitglieder zur Klasse und daher wird das Überschreiben nicht unterstützt, da Unterklassen nur geschützte und öffentliche Instanzmitglieder erben, nicht aber statische Mitglieder. Vielleicht möchten Sie ein Inerface definieren und Factory- und/oder Strategie-Entwurfsmuster untersuchen, um einen alternativen Ansatz zu evaluieren.

1 Stimmen

Haben Sie keine der anderen Antworten gelesen, in denen bereits darauf eingegangen wird und in denen deutlich gemacht wird, dass dies keine ausreichenden Gründe sind, um die Statik auf der konzeptionellen Ebene außer Kraft zu setzen. Wir wissen, dass es nicht funktioniert. Es ist vollkommen "sauber, das Überschreiben von statischen Methoden zu wünschen, und in der Tat ist es in vielen anderen Sprachen möglich.

3voto

faisalbhagat Punkte 2084

Overriding in Java bedeutet einfach, dass die jeweilige Methode auf der Grundlage des Laufzeittyps aufgerufen wird des Objekts aufgerufen wird und nicht auf der Grundlage des Kompiliertyps (was bei überschriebenen statischen Methoden der Fall ist). Da statische Methoden Klassenmethoden sind, sind sie keine Instanzmethoden, so dass sie nichts mit der Tatsache zu tun haben, welche Referenz auf welches Objekt oder welche Instanz zeigt, da sie aufgrund der Natur einer statischen Methode zu einer bestimmten Klasse gehört. Sie können sie in der Unterklasse neu deklarieren, aber diese Unterklasse wird nichts über die statischen Methoden der Elternklasse wissen, weil sie, wie gesagt, nur für die Klasse spezifisch ist, in der sie deklariert wurde. Der Zugriff auf diese Methoden über Objektreferenzen ist nur eine zusätzliche Freiheit, die von den Entwicklern von Java gewährt wurde, und wir sollten nicht daran denken, diese Praxis zu stoppen, wenn sie sie einschränkt. weitere Details und ein Beispiel http://faisalbhagat.blogspot.com/2014/09/method-overriding-and-method-hiding.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X