Warum nicht Java erlauben überschreiben von statischen Methoden?
Warum ist es nicht möglich, das überschreiben von statischen Methoden?
Wenn möglich, verwenden Sie bitte ein Beispiel.
Die meisten OOP-Sprachen nicht zulassen.
siehe meine Antwort. Ich dachte das gleiche wie du, aber dann lernte Ruby/Smalltalk 'class' Methoden und so gibt es andere echte OOP-Sprachen, die dies tun.
die meisten OOP-Sprachen sind nicht echte OOP-Sprache (ich denke, Smalltalk)
Siehe auch stackoverflow.com/q/370962/632951
kann sein, weil Java behebt Aufrufe von statischen Methoden, die zur Kompilierzeit. Also, auch wenn Sie geschrieben haben
siehe meine Antwort. Ich dachte das gleiche wie du, aber dann lernte Ruby/Smalltalk 'class' Methoden und so gibt es andere echte OOP-Sprachen, die dies tun.
die meisten OOP-Sprachen sind nicht echte OOP-Sprache (ich denke, Smalltalk)
Siehe auch stackoverflow.com/q/370962/632951
kann sein, weil Java behebt Aufrufe von statischen Methoden, die zur Kompilierzeit. Also, auch wenn Sie geschrieben haben
Parent p = new Child()
und dann p.childOverriddenStaticMethod()
den compiler aufgelöst wird, die es zu Parent.childOverriddenStaticMethod()
durch das betrachten der Referenz-Typ.InformationsquelleAutor sgokhales | 2010-02-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überschreiben hängt davon ab, ob eine Instanz einer Klasse. Die Stelle des Polymorphismus ist, dass Sie können eine Unterklasse einer Klasse und die Objekte, die für die Implementierung dieser Unterklassen haben unterschiedliche Verhaltensweisen, die für die gleichen Methoden in der Oberklasse definiert (und in den Subklassen überschrieben). Eine statische Methode ist, die nicht im Zusammenhang mit jeder Instanz einer Klasse, so ist das Konzept nicht anwendbar.
Gab es zwei überlegungen, Fahr-Java-design, beeinflusst diese. Der eine war ein Anliegen mit der Leistung: es musste schon eine Menge Kritik von Smalltalk über Sie, weil Sie zu langsam (garbage collection und polymorphe Aufrufe, Teil dieser) und der Java-Macher waren entschlossen, dies zu vermeiden. Ein anderer war die Entscheidung, dass die Zielgruppe für Java-C++ - Entwickler. Herstellung von statischen Methoden arbeiten, wie Sie tun, hat den Vorteil der Vertrautheit für C++ - Programmierer und war auch sehr schnell, weil es keine Notwendigkeit zu warten, bis die Laufzeit, um herauszufinden, welche Methode zu nennen.
objects
) ermöglichen das überladen von Methoden.Objective-C ermöglicht auch das überschreiben - Klasse Methoden.
Es gibt eine compile-time-Typ-Hierarchie und einer run-time-type-Hierarchie. Es macht durchaus Sinn zu Fragen, warum eine statische Methode nennen, nicht in Anspruch nimmt, ist der run-time-Typ-Hierarchie in diesen Situationen, wo es einen gibt. In Java geschieht dies beim Aufruf einer statischen Methode über ein Objekt (
obj.staticMethod()
) - was ist erlaubt und nutzt die compile-Zeit-Typen. Wenn der statische Aufruf in eine nicht-statische Methode einer Klasse, die "aktuelle" Objekt konnte ein abgeleiteter Typ der Klasse -, aber statische Methoden definiert, die sich auf die abgeleiteten Arten sind nicht berücksichtigt (Sie sind in die run-time-Typ-Hierarchie).Ich sollte haben deutlich gemacht: es ist nicht true, das Konzept ist nicht anwendbar.
Diese Antwort, die zwar richtig ist, ist eher, "wie es ist", anstatt wie es sein sollte, oder genauer, wie es sein könnte, um den Erwartungen des OP und damit die hier mich und andere. Es gibt keinen konkreten Grund zu verbieten, die das überschreiben von statischen Methoden außer "das ist, wie es ist". Ich denke, es ist ein Fehler persönlich.
InformationsquelleAutor Nathan Hughes
Ich persönlich denke, dies ist ein Fehler im design von Java. Ja, ja, ich verstehe, dass nicht-statische Methoden sind, die einer instance zugeordnet, während statische Methoden sind an einer Klasse, etc etc. Noch, betrachten Sie den folgenden code:
Dieser code funktioniert nicht, wie man erwarten könnte. Nämlich, SpecialEmployee bekommen Sie einen 2% bonus genau wie reguläre Mitarbeiter. Aber wenn Sie entfernen die "statische"s, dann SpecialEmployee bekommen Sie einen bonus von 3%.
(Zugegeben, dieses Beispiel ist schlechte Programmierung-Stil, dass im wirklichen Leben würden Sie wahrscheinlich wollen, dass der bonus-Multiplikator werden in einer Datenbank irgendwo eher als hart kodiert. Aber das nur, weil ich nicht wollte, bog das Beispiel mit einer Menge code irrelevant für die Stelle.)
Scheint es durchaus plausibel zu mir, dass Sie vielleicht wollen getBonusMultiplier statisch. Vielleicht möchten Sie in der Lage sein, um die Anzeige der bonus-Multiplikator für alle Kategorien von Mitarbeitern, ohne dass eine Instanz eines Mitarbeiters in der jeweiligen Kategorie. Was würde der Punkt sein, von der Suche nach Beispiel-Instanzen? Was ist, wenn wir erstellen eine neue Kategorie von Mitarbeiter und keine Mitarbeiter zugewiesen, um es noch? Das ist ganz logisch eine statische Funktion.
Aber es funktioniert nicht.
Und ja, ja, ich kann mir vorstellen, dass es eine Reihe von Möglichkeiten zu schreiben, die obigen code, damit es funktioniert. Mein Punkt ist nicht, dass es schafft ein unlösbares problem, aber es schafft eine Falle für den unvorsichtigen Programmierer ist, weil die Sprache nicht so verhält, wie ich denke, eine vernünftige person würde erwarten, dass.
Vielleicht, wenn ich zu schreiben versucht, einen compiler für eine OOP-Sprache würde ich schnell sehen, warum die Umsetzung so, dass statische Funktionen können überschrieben werden, wäre es schwierig oder unmöglich.
Oder vielleicht gibt es einige gute Gründe dafür, warum Java auf diese Weise verhält. Kann mir jemand einen Vorteil von diesem Verhalten, gewisse Kategorie von Problemen wird erleichtert durch? Ich meine, nicht nur, zeigen Sie mir die Java-Sprache, spec und sagen: "siehe, das ist dokumentiert, wie er sich verhält". Ich weiß, dass. Aber gibt es einen guten Grund, warum er sich Verhalten SOLLTE, auf diese Weise? (Neben den offensichtlichen, "das Recht auf Arbeit war zu schwer"...)
Update
@VicKirk: Wenn du meinst, dass dies "schlechtes design", weil es nicht passt wie Java-Griffe Statik, meine Antwort ist, "Nun, duh, natürlich." Als ich sagte in meinem ursprünglichen post, es funktioniert nicht. Aber wenn du meinst, dass es schlecht ist design in dem Sinne, dass es etwas grundlegend falsch mit Sprache, wo diese arbeitete, also dort, wo die Statik aufgehoben werden, ebenso wie virtuelle Funktionen, dass dies irgendwie die Einführung einer Mehrdeutigkeit oder es wäre unmöglich zu implementieren, effizient oder so, Antworte ich, "Warum? Was ist falsch an dem Konzept?"
Ich denke, das Beispiel, das ich geben, ist eine sehr Natürliche Sache zu tun zu wollen. Ich habe eine Klasse, die eine Funktion hat, hängt nicht davon ab, jede Instanz, die Daten, und die könnte ich sehr günstig anrufen möchten, unabhängig von einer Instanz, als auch zu wollen, zu nennen, der innerhalb einer Instanz-Methode. Warum sollte das nicht funktionieren? Ich habe in dieser situation eine ganze Reihe von Zeiten im Laufe der Jahre. In der Praxis habe ich es umgehen, indem Sie die Funktion der virtuellen, und dann erstellen Sie eine statische Methode, deren einziger Zweck im Leben ist es, eine statische Methode, übergibt den Anruf an die virtuelle Methode mit einer dummy-Instanz. Das scheint ein sehr Kreisverkehr Weg dorthin.
Bemrose: ja ja, das ist, wie es IST. Ich bin mir nicht debattieren. Wie der code in meinem Beispiel funktioniert nicht, natürlich würde ich nicht versuchen, es zu schreiben. Meine Frage ist, warum es ist, dass Art und Weise. (Ich fürchte, das ist drehen in eine von diesen Unterhaltungen, wo wir gerade nicht kommunizieren. "Entschuldigen Sie mich, Herr Verkäufer, bekomme ich diese in rot?" "Nein, es kostet $5." "Ja, ich weiß, es kostet $5, aber bekomme ich einen roten?" "Sir, ich habe Euch gerade gesagt, dass es kostet $5." "Okay, ich weiß der Preis, aber ich wurde gefragt, über die Farbe." "Ich habe dir bereits gesagt der Preis!" etc.)
Ich denke, dass letztlich dieser code ist verwirrend. Überlegen Sie, ob die Instanz als parameter übergeben wird. Dann sagen Sie, dass die Laufzeit-Instanz sollte diktieren, welche statische Methode aufgerufen wird. Grundsätzlich macht eine ganze separate Hierarchie parallel zu der vorhandenen Instanz. Was nun, wenn eine Unterklasse definiert, die gleiche Methode, die Signatur als nicht-statisch? Ich denke, dass die Regeln würde die Dinge ziemlich kompliziert. Es ist genau diese Art von Komplikationen, die Sprache Java zu vermeiden versucht.
RE "Runtime-Instanz diktieren, die statische Methode heißt": Genau. Ich sehe nicht ein, warum Sie können nicht alles tun, mit einer statischen, die Sie tun können, mit eine virtuelle. "Separate Hierarchie": ich würde sagen, Machen Sie es Teil der gleichen Hierarchie. Warum gibt es keine Statik in der gleichen Hierarchie? "Subsclass definiert die gleiche Signatur nicht-statisch": ich vermute, dass es illegal wäre, genauso wie es illegal ist, sagen wir, eine Unterklasse überschreiben von Funktionen mit identischer Signatur, aber einen anderen return-Typ, der nicht oder nicht werfen alle die Ausnahmen, die die Eltern wirft, oder auf einen engeren Umfang.
Ich glaube, Jay hat einen Punkt - es überrascht mich auch, als ich entdeckte, dass die Statik konnte nicht überschrieben werden. Zum Teil, weil wenn ich Einen mit der Methode
someStatic()
und B extends A, dannB.someMethod()
bindet, um die Methode in A. Wenn ich später ergänzensomeStatic()
zu B, der aufrufende code ist immer noch ruftA.someStatic()
bis ich den aufrufenden code. Auch wundert es mich, dassbInstance.someStatic()
verwendet die erklärt Art der bInstance, nicht die Spielzeit geben, weil es bindet zur compile-link nicht, soA bInstance; ... bInstance.someStatic()
ruft A. someStatic() wenn wenn B. someStatic() existiert.InformationsquelleAutor Jay
Die kurze Antwort ist: es ist durchaus möglich, aber Java funktioniert es nicht.
Hier ist etwas code, der zeigt die aktuellen Stand der Dinge in Java:
Datei
Base.java
:Datei
Child.java
:Wenn Sie dies ausführen (ich habe es auf einem Mac aus Eclipse mit Java 1.6) erhalten Sie:
Hier, die nur Fälle, die könnte eine überraschung sein (und was die Frage ist), erscheinen die ersten Fall:
"Der run-time-Typ wird nicht verwendet, um zu bestimmen, welche statische Methoden aufgerufen werden, auch wenn der Aufruf mit einer Objekt-Instanz (
obj.staticMethod()
)."und die letzten Fall:
"Beim Aufruf einer statische Methode innerhalb einer Objekt-Methode einer Klasse, die statische Methode gewählt, die einen Zugang von der Klasse selbst und nicht aus der Klasse der Festlegung der Laufzeit-Typ des Objekts."
Aufruf mit einer Objekt-Instanz
Den statischen Aufruf behoben ist zur compile-Zeit, in der Erwägung, dass eine nicht-statische Methode aufrufen, wird zur Laufzeit aufgelöst. Beachten Sie, dass obwohl statische Methoden sind geerbt (von den Eltern) sind Sie nicht überschrieben (von Kind). Dies könnte eine überraschung erleben, wenn Sie sich anders zu erwarten.
Aufruf innerhalb einer Objekt-Methode
Objekt Methodenaufrufe aufgelöst werden mithilfe der run-time-Typ, aber statische (Klasse) - Methode Aufrufe werden aufgelöst, mit der compile-Zeit (deklarierten) Typs.
Änderung der Regeln
Ändern diese Regeln, so dass der Letzte Anruf, in dem Beispiel genannt
Child.printValue()
statische Aufrufe hätte mit einem Typ zur Laufzeit, anstatt der compiler das auflösen der Aufruf zur compile-Zeit mit der deklarierten Klasse des Objekts (oder Kontext). Statische Aufrufe könnte dann die (dynamische) type-Hierarchie zu lösen, der Anruf, nur als Objekt-Methode ruft heute tun.Wäre dies leicht machbar sein (wenn wir verändert Java :-O), und ist überhaupt nicht unvernünftig, aber es hat einige interessante überlegungen.
Die wichtigste überlegung ist, dass wir brauchen, um zu entscheiden die statische Methode aufruft, sollte dies tun.
In dem moment, Java hat diese "Macke" in der Sprache, wobei
obj.staticMethod()
Anrufe werden ersetzt durchObjectClass.staticMethod()
Anrufe (in der Regel mit einer Warnung). [Hinweis:ObjectClass
ist der compile-Zeit-Typ vonobj
.] Das wären gute Kandidaten für das überschreiben in dieser Art und Weise, wobei die Laufzeit-Typ vonobj
.Wenn wir es machen würden, Methode Körper schwerer zu Lesen: statische Aufrufe in einer übergeordneten Klasse werden könnten dynamisch "re-routed" werden. Um dies zu vermeiden, würden wir den Aufruf der statischen Methode mit einem Klassennamen -- und das macht die Anrufe mehr offensichtlich gelöst mit der compile-Zeit-Typ-Hierarchie (so wie jetzt).
Andere Möglichkeiten für den Aufruf einer statischen Methode sind komplizierter:
this.staticMethod()
sollte das gleiche bedeuten wieobj.staticMethod()
, wobei die Laufzeit-Typ vonthis
. Dies kann jedoch dazu führen, dass einige Probleme mit der bestehenden Programme, in denen (scheinbar lokal) statische Methoden ohne Dekoration (das ist wohl äquivalent zuthis.method()
).Was ist also ungeschminkt nennt
staticMethod()
? Ich schlage vor, Sie das gleiche tun wie heute, und verwenden Sie die lokale Klasse Kontext zu entscheiden, was zu tun ist. Ansonsten große Verwirrung würde entstehen. Natürlich bedeutet es, dassmethod()
würde bedeutenthis.method()
wennmethod
war eine nicht-statische Methode, undThisClass.method()
wennmethod
waren eine statische Methode. Dies ist eine weitere Quelle der Verwirrung.Andere überlegungen
Wenn wir verändert dieses Verhalten (und statische Aufrufe potentiell dynamisch nicht-lokale), wir würden wahrscheinlich zu überdenken, die Bedeutung von
final
,private
undprotected
als Qualifier aufstatic
Methoden einer Klasse. Dann würden wir alle haben, um sich an die Tatsache, dassprivate static
undpublic final
Methoden werden nicht überschrieben, und kann daher sicher gelöst zur compile-Zeit, und sind "sicher" zu Lesen, wie lokale Referenzen.InformationsquelleAutor Steve Powell
Eigentlich waren wir falsch.
Trotz Java nicht erlauben, das überschreiben von statischen Methoden standardmäßig, wenn man sich gründlich durch-Dokumentation der Klasse und der Methode von Klassen in Java können Sie immer noch einen Weg finden, zu emulieren statische Methoden überschreiben, indem Sie folgenden workaround:
Ausgabe:
was wir erreichen wollten 🙂
Sogar erklären wir die Dritte variable Carl als RegularEmployee und weisen Sie es-Instanz von SpecialEmployee, wir haben noch call of RegularEmployee Methode im ersten Fall und call of SpecialEmployee Methode im zweiten Fall
einfach nur Aussehen bei der Ausgabe-Konsole:
😉
Nice hack, aber es ist unwahrscheinlich, dass jemand würde es in die eigentliche Produktion....
Diese Antwort ist die größte hack ich bisher gesehen habe, auf allen Java-Themen. War lustig zu Lesen ist es trotzdem 🙂
InformationsquelleAutor Patlatus
Statische Methoden werden behandelt, als global durch die JVM gibt es nicht an ein Objekt gebunden Instanz überhaupt.
Könnte es konzeptionell möglich sein, wenn Sie könnten Aufruf von statischen Methoden aus der Klasse von Objekten (wie in Sprachen wie Smalltalk), aber es ist nicht der Fall in Java.
BEARBEITEN
Können Sie überlastung statische Methode, ist das ok. Aber man kann nicht überschreiben eine statische Methode, da die Klasse keine erste-Klasse-Objekt. Sie können verwenden Sie reflektion, um die Klasse eines Objekts zur Laufzeit, aber das Objekt, das Sie erhalten, nicht parallel zu den Klassen-Hierarchie.
Können Sie reflektieren über die Klassen, aber es bleibt dort. Sie nicht, rufen Sie eine statische Methode, indem Sie
clazz1.staticMethod()
, aber mitMyClass.staticMethod()
. Eine statische Methode nicht an ein Objekt gebunden und es ist daher keine Vorstellung vonthis
nochsuper
in einer statischen Methode. Eine statische Methode ist eine Globale Funktion; als Folge gibt es auch keine Vorstellung von Polymorphismus und daher-Methode überschreiben macht keinen Sinn.Aber könnte dies möglich sein, wenn
MyClass
war ein Objekt zur Laufzeit auf dem eine Methode aufgerufen wird, wie in Smalltalk (oder vielleicht JRuby als ein Kommentar empfehlen, aber ich weiß nichts von JRuby).Ach ja... noch eine Sache. Sie können aufrufen einer statischen Methode über ein Objekt
obj1.staticMethod()
aber, dass wirklich syntaktischen Zucker fürMyClass.staticMethod()
und sollte vermieden werden. Es in der Regel löst eine Warnung in der modernen IDE. Ich weiß nicht, warum Sie überhaupt erlaubt diese Verknüpfung.Klassen existieren als Objekte in Java. Finden Sie die "Class" - Klasse. Ich kann sagen, myObject.getClass() und es wird mich zurückbringen, eine Instanz der entsprechenden Klasse object.
Sie erhalten nur eine "Beschreibung" der Klasse-nicht die Klasse selbst. Aber der Unterschied ist subtil.
Haben Sie immer noch Klasse, aber es ist versteckt in der VM (in der Nähe des class-loader), die user haben fast keinen Zugang zu ihm.
Verwenden
clazz2 instanceof clazz1
richtig Sie können stattdessenclass2.isAssignableFrom(clazz1)
, ich glaube, Sie würde true zurückgeben, in Ihrem Beispiel.InformationsquelleAutor ewernli
Methode überschreiben ist möglich durch dynamische Disposition, was bedeutet, dass der deklarierte Typ eines Objekts nicht bestimmen sein Verhalten, sondern seinen Laufzeit-Typ:
Obwohl beide
lassie
undkermit
deklariert werden als Objekte vom TypAnimal
Ihr Verhalten (Methode.speak()
) variiert, da die dynamische Disposition wird nur binden Aufruf der Methode.speak()
eine Implementierung zur Laufzeit, nicht zur compile-Zeit.Nun, hier ist, wo die
static
Schlüsselwort beginnt Sinn zu machen: das Wort "static" ist ein antonym für "dynamic". Also der Grund, warum können Sie nicht überschreiben von statischen Methoden ist, da es keine dynamische Disposition auf statische member - da statische bedeutet wörtlich "nicht dynamisch". Wenn Sie ausgelöst wird dynamisch (und damit könnte überschrieben werden) diestatic
Stichwort wäre einfach keinen Sinn mehr.InformationsquelleAutor Richard JP Le Guen
Ja. Praktisch Java ermöglicht das überschreiben der statischen Methode, und Nicht theoretisch, wenn Sie Überschreiben eine statische Methode in Java, dann wird es kompiliert und laufen, aber flüssig wird es verlieren Polymorphismus was ist die grundlegende Eigenschaft von Java. Sie wird Überall zu Lesen, dass es nicht möglich ist, zu versuchen, selbst zu kompilieren und ausführen. Sie erhalten Ihre Antwort. z.B. Wenn Sie die Klasse Tier und eine statische Methode Essen() und Überschreiben Sie, dass statische Methode in der Unterklasse können nennt es Hund. Dann, wenn, wo immer Sie Weisen ein Hund-Objekt, um eine Tier-Reference und call-Essen() nach Java, Hund zu Essen() sollte genannt worden, aber in der statisch Übergeordneten Tiere Essen() Aufgerufen Werden.
Laut Polymorphismus Prinzip von Java, die Ausgabe Sollte
Dog Eating
.Aber das Ergebnis war anders, weil die Unterstützung Polymorphismus Java Späte Bindung das bedeutet, dass Methoden aufgerufen werden, die nur an der Laufzeit, nicht aber bei statischen Methoden. In statischen Methoden compiler ruft Methoden zur compile-Zeit statt, die Laufzeit, so erhalten wir die Methoden nach der Referenz und nicht nach dem Objekt einen Verweis enthalten, dass ist der Grund, warum Man sagen kann, Praktisch, es unterstützt statische overring aber theoretisch tut es das nicht.
InformationsquelleAutor Shubham Soni
In Java (und vielen OOP-Sprachen, aber ich kann nicht sprechen für alle, und manche haben nicht statisch überhaupt) alle Methoden haben eine Feste Signatur - Parameter und-Typen. In einer virtuellen Methode, der erste parameter ist implizit: eine Referenz auf das Objekt selbst und beim Aufruf von innerhalb des Objekts, der compiler fügt automatisch
this
.Gibt es keinen Unterschied für statische Methoden - Sie haben immer noch eine Feste Signatur. Jedoch, indem er die Methode statisch, Sie haben ausdrücklich erklärt, dass der compiler nicht die implizite Objekt-parameter am Anfang der Signatur. Daher ein anderer code ruft diese müssen muss nicht versuchen, eine Referenz auf ein Objekt auf dem stack. Wenn Sie getan haben, dass dann die Ausführung der Methode würde nicht funktionieren, da die Parameter wäre an der falschen Stelle verschoben, von einem auf den stack.
Weil dieser Unterschied zwischen den beiden; virtuelle Methoden haben immer eine Referenz auf das Kontext-Objekt (d.h.
this
) so dann ist es möglich, Verweis nichts in dem Haufen gehören, die Instanz des Objekts. Aber mit statischen Methoden, da es keine Referenz übergeben, dass die Methode keinen Zugriff auf Objektvariablen und-Methoden, da der Kontext nicht bekannt ist.Wenn Sie möchten, dass Java würde die definition ändern, so dass ein Kontext-Objekt übergeben wird, für jede Methode, static oder virtual, dann würden Sie im wesentlichen nur virtuelle Methoden.
Als jemand fragte in einem Kommentar nach der op - was ist Ihr Grund und Zweck für den Wunsch dieses feature?
Ich weiß nicht, Ruby viel, wie dies bereits erwähnt wurde, durch die OP, habe ich einige der Forschung. Ich sehe, dass in Ruby-Klassen sind wirklich eine Besondere Art von Objekt und eine erstellen kann (auch dynamisch), neue Methoden. Klassen voll sind Objekte der Klasse in Ruby, Sie sind nicht in Java. Dies ist nur etwas, was Sie akzeptieren müssen, wenn die Arbeit mit Java (oder C#). Diese sind nicht dynamische Sprachen, aber C# ist das hinzufügen einige Formen von dynamischen. In der Realität, Ruby nicht "statische" Methoden, soweit ich finden konnte - in diesem Fall sind diese Methoden in der singleton-Klasse object. Sie können dann überschreiben Sie diese singleton-mit einer neuen Klasse und die Methoden in der vorherigen Klasse-Objekt, rufen die in der neuen Klasse (richtig?). Also, wenn Sie aufgerufen, eine Methode, die im Rahmen der ursprünglichen Klasse, der immer noch nur ausführen, die ursprüngliche Statik, aber das aufrufen einer Methode in der abgeleiteten Klasse, würde Methoden aufrufen, entweder von den Eltern oder sub-Klasse. Interessant, und ich sehen kann, einigen Wert. Es braucht ein anderes denken Muster.
Da Sie arbeiten in Java, müssen Sie anpassen, die Art und Weise, Dinge zu tun. Warum Taten Sie dies? Gut, wahrscheinlich um die performance zu verbessern an der Zeit basiert auf der Technologie und das Verständnis, was verfügbar war. Computer Sprachen werden ständig weiterentwickelt. Zurück weit genug, und es gibt keine solche Sache wie OOP. In der Zukunft wird es weitere, neue Ideen.
BEARBEITEN: Einen anderen Kommentar. Nun, ich sehe die Unterschiede, und wie ich Java/C# - Entwickler kann ich verstehen, warum die Antworten bekommen Sie aus der Java-Entwickler kann verwirrend sein, wenn Sie aus einer Sprache wie Ruby. Java
static
Methoden sind nicht die gleichen wie Rubyclass
Methoden. Java-Entwickler haben eine harte Zeit, dies zu verstehen, wie Umgekehrt diejenigen, die arbeiten meist mit einer Sprache wie Ruby/Smalltalk. Ich kann sehen, wie dies wäre auch sehr verwirrend durch die Tatsache, dass Java verwendet auch "class-Methode", als eine andere Art und Weise zu sprechen über statische Methoden, aber das gleiche Begriff verwendet wird, unterschiedlich von Ruby. Java funktioniert nicht-Ruby-Stil-Klasse-Methoden (sorry); Ruby nicht über Java-Stil statischen Methoden, das sind wirklich nur alte prozeduralen Stil-Funktionen, wie Sie in C.Übrigens - danke für die Frage! Ich lernte etwas neues für mich heute über die Klasse Methoden (Ruby-Stil).
InformationsquelleAutor Kevin Brock
Gut... die Antwort ist NEIN, wenn man aus der Perspektive, wie eine überschreiben-Methode soll das Verhalten in Java. Aber, das bekommt man nicht alle compiler-Fehler, wenn Sie versuchen, zu überschreiben einer statischen Methode. Das bedeutet, dass, wenn Sie versuchen, zu überschreiben, Java nicht zu stoppen Sie tun; aber Sie sicherlich nicht die gleiche Wirkung, wie Sie für nicht-statische Methoden. Überschreiben in Java bedeutet einfach, dass die jeweilige Methode aufgerufen werden würde, basierend auf dem laufzeittyp des Objekts und nicht auf die compile-Zeit-Typ (was der Fall ist überschrieben mit statischen Methoden). Okay... alle Vermutungen für den Grund, warum Verhalten Sie sich seltsam? Weil Sie Klasse-Methoden und damit der Zugang zu Ihnen wird immer gelöst, die während der Kompilierung nur mit compile-Zeit-Typ-Informationen. Der Zugriff über Objekt-Referenzen ist nur eine zusätzliche Freiheit gegeben, durch die Designer von Java, und wir sollten sicherlich nicht, dass zu stoppen, dass die Praxis nur, wenn Sie es beschränken 🙂
Beispiel: lassen Sie uns versuchen, um zu sehen, was passiert, wenn wir versuchen, das überschreiben einer statischen Methode:-
Ausgabe:-
SuperClass: inside staticMethod
SuperClass: inside staticMethod
SubClass: inside staticMethod
Beachten Sie die zweite Zeile der Ausgabe. Hatte die staticMethod wurde überschrieben ist diese Zeile sollte identisch mit der Dritten Zeile, während wir versuchen, der Beschwörung des 'staticMethod()' auf ein Objekt der Laufzeit Geben Sie als 'Unterklasse' und nicht als 'Oberklasse'. Dies bestätigt, dass die statische Methoden sind immer aufgelöst, mit deren compile-Zeit-Typ-Informationen nur.
InformationsquelleAutor Rupesh Yadav
Im Allgemeinen ist es nicht sinnvoll zu ermöglichen "überschreiben" von statischen Methoden als würde es kein guter Weg, um zu bestimmen, welche zum Aufruf zur Laufzeit. Wobei die Mitarbeiter B., wenn wir rufen RegularEmployee.getBonusMultiplier() - Methode ausgeführt werden soll?
Im Fall von Java, könnte man sich vorstellen, eine Sprache, die definition, wo es möglich ist, zu 'überschreiben' - statische Methoden so lange, wie Sie genannt werden, die durch eine Objekt-Instanz. Aber all dies tun würde, zu re-implementieren einer regulären Klasse von Methoden, die das hinzufügen von Redundanz zu der Sprache, ohne wirklich hinzufügen profitieren.
Erm ... Jay, eine statische Methode haben, brauchen nicht (im Allgemeinen nicht) aufgerufen, die eine Instanz ...
aber dann ist es noch einfacher, nicht? Wenn eine statische Methode aufgerufen wird mit einem Klassennamen, die Sie verwenden würden, die geeignete Methode für die Klasse.
Aber was ist dann überschreiben für Sie tut. Rufen Sie A. doStuff() sollte es die version verwenden, die außer Kraft gesetzt wurde, in "B extends A" oder die version, die war überschrieben "C extends A". Und wenn Sie C oder B, dann sind Sie nannte die Versionen eh... keine überwiegenden notwendig.
Es ist wahr, dass eine statische Methode ist grundsätzlich nicht aufgerufen, wobei eine Instanz, aber ich vermute, dass es ist, weil ein solcher Aufruf nichts tut, sinnvoll, da das aktuelle design von Java! Ich bin darauf hindeutet, dass ein alternativer Entwurf hätte eine bessere Idee. BTW, in einem sehr realen Sinn, static-Funktionen aufgerufen werden, mit einer Instanz ganz routinemäßig: Wenn Sie rufen Sie die statische Funktion von innerhalb einer virtuellen Funktion. Dann sind Sie implizit erhalten.Funktion(), also die aktuelle Instanz.
InformationsquelleAutor Lars
überschreiben ist reserviert für die Instanz, Mitglieder zu unterstützen polymorphe Verhalten. statische Klassenmember gehören nicht zu einer bestimmten Instanz. stattdessen statische-Mitglieder gehören der Klasse und als Folge das überschreiben wird nicht unterstützt, da Unterklassen nur Erben, geschützt und öffentliche instanzmember und nicht statische member. Sie definieren ein inerface und Forschung, Fabrik-und/oder Strategie-Entwurfsmuster zu bewerten, die einen alternativen Ansatz.
Richard, nehmen wir an, für eine minute, dass, wenn ich auf diese Frage geantwortet vor 4 Jahren die meisten dieser Antworten waren nicht gebucht wurde, also nicht so ein Esel! Es gibt keine Notwendigkeit, zu behaupten, dass ich nicht sorgfältig gelesen. Außerdem, hast du nicht gelesen, dass wir nur diskutieren überschreiben mit Bezug zu Java. Wer kümmert sich, was möglich ist, auch in anderen Sprachen. Es ist irrelevant. Gehen Sie troll woanders. Ihren Kommentar nicht hinzufügen, etwas von Wert zu diesem thread.
InformationsquelleAutor Athens Holloway
Ich mag und double Jay ' s Kommentar (https://stackoverflow.com/a/2223803/1517187).
Ich bin damit einverstanden, dass dies das schlechte design von Java auf.
Viele andere Sprachen unterstützen, überschreiben von statischen Methoden, wie wir in früheren Kommentaren.
Ich fühle mich Jay hat auch gekommen, um Java von Delphi gefällt mir.
Delphi (Object Pascal) war die erste Sprache, die Umsetzung von OOP.
Es ist offensichtlich, dass viele Menschen, die bereits Erfahrung mit dieser Sprache, da es in der Vergangenheit war die einzige Sprache zu schreiben, kommerzielle GUI-Produkte. Und - ja, wir könnten in Delphi überschreiben von statischen Methoden. Eigentlich statische Methoden in Delphi, werden als "Klassen-Methoden", während Delphi hatte die verschiedenen Konzept der "Delphi-statische Methoden" wurden Methoden für die frühe Bindung. Überschreiben von Methoden, die Sie hatte, die späte Bindung verwenden, erklären "virtual" - Richtlinie. So war es sehr bequem und intuitiv, und ich würde erwarten, dass dieses in Java.
InformationsquelleAutor Patlatus
Durch überschreiben können wir eine polymorphe Natur je nach Typ des Objekts. Statische Methode hat keinen Bezug zu Objekt. So kann java nicht unterstützt statische Methode überschreiben.
InformationsquelleAutor DeveloperArnab
Antwort auf diese Frage ist einfach, die Methode oder die variable markiert als static gehört zur Klasse nur So, dass statische Methode kann nicht geerbt werden, in der sub-Klasse, denn Sie gehören zu den super Klasse nur.
Sie sollten Folgen Sie diesem link für die ausführliche Antwort geeksforgeeks.org/...
Danke für den link. Eigentlich bin ich hier, um nützlich zu sein, um Neuankömmlinge auf der Website, um zu erklären, wie die Website funktioniert, für diejenigen, die nicht verwendet werden, und nicht, weil ich brauchte eine Antwort auf die Frage.
InformationsquelleAutor G4uKu3_Gaurav
Überschreiben in Java bedeutet einfach, dass die jeweilige Methode aufgerufen werden würde, basierend auf dem runtime-Typ
der Objekt-und nicht auf die compile-Zeit-Typ (was der Fall ist überschrieben mit statischen Methoden). Als statische Methoden sind Klassenmethoden Sie sind nicht Instanz-Methoden, so dass Sie haben nichts zu tun mit der Tatsache, die Referenz verweist auf das Objekt oder die Instanz werden, da aufgrund der Natur der statischen Methode gehört zu einer bestimmten Klasse. Sie können deklarieren Sie in der Unterklasse, jedoch, dass die Unterklasse nicht wissen nichts über die parent-Klasse statische Methoden, weil, wie ich sagte, es ist spezifisch für nur dieser Klasse, in dem es deklariert wurde. Der Zugriff über Objekt-Referenzen ist nur eine zusätzliche Freiheit gegeben, durch die Designer von Java, und wir sollten sicherlich nicht, dass zu stoppen, dass die Praxis nur, wenn Sie es einzuschränken
weitere details und Beispiel
http://faisalbhagat.blogspot.com/2014/09/method-overriding-and-method-hiding.html
InformationsquelleAutor faisalbhagat
Durch überschreiben erreichen Sie eine dynamische Polymorphie.
Wenn Sie sagen, das überschreiben von statischen Methoden, die Wörter, die Sie versuchen, zu verwenden sind widersprüchlich.
Statische sagt - compile-Zeit, überschreiben ist die dynamische Polymorphie.
Beide sind im Gegenteil in der Natur, und daher können nicht zusammen verwendet werden.
Dynamische polymorphe Verhalten kommt, wenn ein Programmierer verwendet ein Objekt und Zugriff auf eine Instanz-Methode. JRE wird die Karte verschiedene Instanz-Methoden von verschiedenen Klassen, basierend auf welche Art von Objekt Sie verwenden.
Wenn Sie sagen, übergeordnete statische Methoden, statische Methoden, die wir zugreifen, mit dem Klassennamen, die verbunden werden, die zur compile-Zeit, so gibt es kein Konzept der Verknüpfung von Methoden zur Laufzeit mit statischen Methoden. Also der Begriff "überwiegendes" statische Methoden selbst macht keinen Sinn.
Hinweis: auch wenn Sie den Zugriff auf Methode einer Klasse mit einem Objekt, noch java-compiler ist intelligent genug, es herauszufinden, und werde tun, statische Links.
statisch bedeutet nicht kompilieren, statisch bedeutet, dass es gebunden ist, Klasse dann eher einem bestimmten Objekt. es macht so viel wenn nicht mehr Sinn, als die Schaffung einer class factory, außer statischen
Box.createBox
mehr Sinn macht, alsBoxFactory.createBox
, und ist eine unvermeidliche Muster, wenn Sie benötigen, um Fehler überprüfen Aufbau ohne auslösen von Ausnahmen(Konstruktoren können nicht scheitern, Sie können nur töten die Prozess - /throw exception), in der Erwägung, dass eine statische Methode null zurückgeben kann, die auf Fehler oder akzeptieren auch Erfolg/Fehler-callbacks, etwas zu schreiben wie hastebin.com/codajahati.java.InformationsquelleAutor user1923551
Was gut wird es tun, um überschreiben von statischen Methoden. Sie kann nicht rufen statische Methoden über eine Instanz.
EDIT : Es scheint, dass durch ein bedauerliches versehen in design-Sprache, die Sie kann Aufruf von statischen Methoden über eine Instanz. In der Regel niemand tut, dass. Mein schlechtes.
In der Tat Java nicht erlaubt, statische member, auf die zugegriffen werden über Instanzen: siehe Static-variable in Java
Eine richtige moderne IDE wird eine Warnung generieren, wenn Sie das tun, obwohl, so zumindest kann man es fangen, während Oracle können, halten Sie die rückwärts-Kompatibilität Sache gehen.
Es gibt nichts konzeptionell falsch mit dem Aufruf einer statischen Methode über eine Instanz. Das ist Wortklauberei für Wortklauberei Willen. Warum sollte so etwas wie eine Date-Instanz NICHT nennen seine eigene statische Methoden übergeben von Instanz-Daten an die Funktion durch die aufrufende Schnittstelle?
Das ist nicht das, was Sie sind Wortklauberei über. Die Frage ist, warum ist es erlaubt zu nennen
variable.staticMethod()
stattClass.staticMethod()
, wovariable
ist eine variable, die mit dem deklarierten TypClass
. Ich Stimme zu, es ist schlechtes design-Sprache.InformationsquelleAutor fastcodejava
Einfache Lösung: Verwenden Sie die singleton-Instanz. Es wird damit übersteuert und Vererbung.
In meinem system, ich habe SingletonsRegistry class, gibt Instanz für die Klasse übergeben. Wenn die Instanz nicht gefunden wird, wird es erstellt.
Haxe Sprache Klasse:
Das ist viel besser umgesetzt in Java als statische Methode in der Klasse selbst;
Singleton.get()
. Die Registrierung ist nur boilerplate-overhead, und es verhindert, GC auf der Klassen.Sie sind Recht, es ist eine klassische Lösung. Ich weiß nicht genau daran erinnern, warum ich wählte, registry, hatte wohl einen Rahmen des Denkens und führte zu diesem Ergebnis.
InformationsquelleAutor Raivo Fishmeister
Einer Statischen Methode, variable, block oder geschachtelte Klasse gehört der ganzen Klasse eher als ein Objekt.
Einer Methode in Java wird verwendet, um die zu entlarven, die das Verhalten eines Objekts /der Klasse. Hier, wie die Methode ist statische (ich.e, statische-Methode wird verwendet, um zu repräsentieren das Verhalten einer Klasse nur.) ändern/überschreiben das Verhalten der gesamten Klasse gegen das Phänomen einer wesentlichen Säule der objektorientierten Programmierung ich.e, hohe Kohäsion. (denken Sie daran ein Konstruktor ist eine spezielle Methode in Java.)
Hohe Kohäsion - Eine Klasse sollte nur eine Rolle. Zum Beispiel: Ein Auto der Klasse erzeugen soll, nur Auto-Objekten und nicht Motorrad, LKW, Flugzeuge usw. Aber der Car-Klasse können einige Funktionen(Verhalten), der gehört nur sich selbst.
Daher, bei der Gestaltung der Programmiersprache java. Die Sprache, die Designer gedacht, um Entwicklern zu ermöglichen, halten einige Verhaltensweisen einer Klasse auf sich selbst nur, indem Sie eine Methode statischer Natur ist.
Den unten Stück code versucht, überschreiben Sie die statische Methode, sondern wird nicht Probleme bei der Kompilierung Fehler.
Dies ist, weil, hier sind wir nicht eine Methode überschreibt, aber wir sind nur re-deklarieren. Java ermöglicht die re-Deklaration einer Methode (statisch/nicht-statisch).
Entfernen Sie das static-Schlüsselwort aus getVehileNumber () - Methode der Car-Klasse wird in Kompilierungsfehler, Da wir versuchen, ändern die Funktionalität der statischen Methode, die gehört zum Fahrzeug-Klasse nur.
Auch, Wenn die getVehileNumber() ist deklariert als letzten dann wird der code nicht kompilieren, Da die final-Schlüsselwort schränkt den Programmierer von der re-Deklaration der Methode.
Insgesamt ist dies bis zu software-Designer für die Verwendung der statischen Methoden.
Ich persönlich bevorzuge statische Methoden verwenden, um einige Aktionen, die ohne die Schaffung einer Instanz einer Klasse. Zweitens, sich zu verstecken, das Verhalten einer Klasse von außen.
InformationsquelleAutor Rohit Gaikwad
Hier ist eine einfache Erklärung. Eine statische Methode ist einer Klasse zugeordnet, während eine Instanz-Methode ist, die einem bestimmten Objekt zugeordnet. Überschreibt ermöglichen das aufrufen der unterschiedlichen Implementierung der überschriebenen Methoden verbunden mit dem jeweiligen Objekt. So ist es counter-intuitive, zu überschreiben statische Methode, die nicht auch im Zusammenhang mit Objekten, sondern der Klasse selbst in den ersten Platz. Also statische Methoden können nicht überschrieben werden, basierend auf dem, was Objekt ist, aufrufen, wird es immer sein, die der Klasse zugeordnet, wo es erstellt wurde.
public abstract IBox createBox();
innen IBox interface? Box umsetzen können IBox überschreiben createBox, und die Erstellung von Ergebnis-Objekt in einen gültigen IBox, ansonsten null zurück. Konstruktoren können nicht zurück "null" und daher sind Sie gezwungen, (1) Ausnahmen ÜBERALL(was wir jetzt tun), oder (2) erstellen Sie factory-Klassen, die tun, was ich früher gesagt habe, aber in einer Weise, die keinen Sinn macht, Neulinge noch Experten von Java(Was wir auch jetzt tun). Statische implementierte Methoden lösen.InformationsquelleAutor Rafsan Mobasher
Sehen nun, über Antworten jeder weiß, dass wir können nicht außer Kraft gesetzt statischen Methoden, aber man sollte nicht missverstanden über die Konzept der Zugriff auf statische Methoden aus der Unterklasse.
Zum Beispiel, siehe unten code:-
Ausgabe:-
Dank
InformationsquelleAutor Amandeep
Der folgende code zeigt, dass es möglich ist:
osm
istOverridenStaticMeth
nichtOverrideStaticMeth
.Auch würde ich versuchen zu vermeiden, mit so viel Meth, während der Programmierung <big grin>;
InformationsquelleAutor pop stack