Warum ist es nicht möglich, statische Methoden außer Kraft zu setzen?
Wenn möglich, verwenden Sie bitte ein Beispiel.
Warum ist es nicht möglich, statische Methoden außer Kraft zu setzen?
Wenn möglich, verwenden Sie bitte ein Beispiel.
Wozu soll es gut sein, statische Methoden zu überschreiben. Sie können statische Methoden nicht über eine Instanz aufrufen.
MyClass.static1()
MySubClass.static1() // If you overrode, you have to call it through MySubClass anyway.
EDIT : Durch ein unglückliches Versehen im Sprachdesign haben Sie anscheinend kann statische Methoden über eine Instanz aufrufen. Normalerweise macht das niemand. Mein Fehler.
In der Tat erlaubt Java den Zugriff auf statische Mitglieder über Instanzen: siehe Statische Variable in Java
Eine ordentliche, moderne IDE erzeugt eine Warnung, wenn Sie das tun, so dass Sie es zumindest abfangen können, während Oracle die Abwärtskompatibilität aufrechterhalten kann.
Es ist konzeptionell nicht falsch, eine statische Methode über eine Instanz aufzurufen. Das ist eine Spitzfindigkeit um der Spitzfindigkeit willen. Warum sollte etwas wie eine Date-Instanz ihre eigenen statischen Methoden NICHT aufrufen, indem sie Instanzdaten über die aufrufende Schnittstelle an die Funktion weitergibt?
Hallo G4uKu3_Gaurav. Danke, dass Sie sich für einen Beitrag entschieden haben. Allerdings erwarten wir in der Regel längere und ausführlichere Antworten als diese.
@DJClayworth für eine ausführliche Antwort sollten Sie diesem Link folgen geeksforgeeks.org/
Einfache Lösung: Verwenden Sie eine Singleton-Instanz. Es wird Überschreibungen und Vererbung ermöglichen.
In meinem System habe ich die Klasse SingletonsRegistry, die eine Instanz für die übergebene Klasse zurückgibt. Wenn die Instanz nicht gefunden wird, wird sie erstellt.
Haxe-Sprachklasse:
package rflib.common.utils;
import haxe.ds.ObjectMap;
class SingletonsRegistry
{
public static var instances:Map<Class<Dynamic>, Dynamic>;
static function __init__()
{
StaticsInitializer.addCallback(SingletonsRegistry, function()
{
instances = null;
});
}
public static function getInstance(cls:Class<Dynamic>, ?args:Array<Dynamic>)
{
if (instances == null) {
instances = untyped new ObjectMap<Dynamic, Dynamic>();
}
if (!instances.exists(cls))
{
if (args == null) args = [];
instances.set(cls, Type.createInstance(cls, args));
}
return instances.get(cls);
}
public static function validate(inst:Dynamic, cls:Class<Dynamic>)
{
if (instances == null) return;
var inst2 = instances[cls];
if (inst2 != null && inst != inst2) throw "Can\'t create multiple instances of " + Type.getClassName(cls) + " - it's singleton!";
}
}
Dies ist in Java viel besser als statische Methode in der Klasse selbst implementiert; Singleton.get()
. Die Registry ist nur Boilerplate-Overhead und schließt GC für die Klassen aus.
Hier ist eine einfache Erklärung. Eine statische Methode ist mit einer Klasse verbunden, während eine Instanzmethode mit einem bestimmten Objekt verbunden ist. Überschreibungen ermöglichen den Aufruf der verschiedenen Implementierungen der überschriebenen Methoden, die mit dem jeweiligen Objekt verbunden sind. Es ist also kontraintuitiv, eine statische Methode zu überschreiben, die nicht einmal mit Objekten, sondern in erster Linie mit der Klasse selbst verbunden ist. Statische Methoden können also nicht überschrieben werden, je nachdem, welches Objekt sie aufruft; sie werden immer mit der Klasse assoziiert, in der sie erstellt wurden.
Inwiefern ist es kontraintuitiv, eine public abstract IBox createBox();
innerhalb der IBox-Schnittstelle? Box kann IBox implementieren, um createBox zu überschreiben und die Erstellung eines Objekts in einer gültigen IBox resultieren zu lassen, andernfalls wird eine Null zurückgegeben. Konstruktoren können nicht "null" zurückgeben und daher ist man gezwungen, (1) überall Ausnahmen zu verwenden (was wir jetzt tun), oder (2) Fabrikklassen zu erstellen, die das tun, was ich zuvor gesagt habe, aber auf eine Art und Weise, die weder für Anfänger noch für Java-Experten Sinn macht (was wir jetzt auch tun). Statische, nicht implementierte Methoden lösen dieses Problem.
Wenn man sich die obigen Antworten ansieht, weiß jeder, dass wir statische Methoden nicht überschreiben können, aber man sollte nicht missverstehen, dass die Konzept des Zugriffs auf statische Methoden von Unterklassen .
Wir können auf statische Methoden der Oberklasse mit einem Verweis auf die Unterklasse zugreifen, wenn diese statische Methode nicht durch eine neue statische Methode, die in der Unterklasse definiert wurde, verborgen wurde.
Beispiel: siehe folgenden Code:-
public class StaticMethodsHiding {
public static void main(String[] args) {
SubClass.hello();
}
}
class SuperClass {
static void hello(){
System.out.println("SuperClass saying Hello");
}
}
class SubClass extends SuperClass {
// static void hello() {
// System.out.println("SubClass Hello");
// }
}
Ausgabe:-
SuperClass saying Hello
Siehe Java-Orakel-Dokumente und suchen Sie nach Was Sie in einer Unterklasse tun können für Einzelheiten zum Ausblenden statischer Methoden in Unterklassen.
Gracias
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.
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)
0 Stimmen
Siehe auch stackoverflow.com/q/370962/632951
0 Stimmen
Python erlaubt das Überschreiben einer statischen Methode. stackoverflow.com/questions/893015/
2 Stimmen
Kann daran liegen, dass Java Aufrufe zu statischen Methoden zur Kompilierzeit auflöst. Selbst wenn Sie also geschrieben haben
Parent p = new Child()
und dannp.childOverriddenStaticMethod()
löst der Compiler es auf inParent.childOverriddenStaticMethod()
indem Sie sich den Referenztyp ansehen.0 Stimmen
Huzzah, wir können jetzt Dinge schreiben wie hastebin.com/codajahati.java . Mit einem solchen Muster (vorzugsweise mit weniger plumpen Code) kann Java im Wesentlichen alle Ausnahmen aus der Kernbibliothek eliminieren (kann, nicht wird), oder wir können einfach Dinge verpacken.