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)

2voto

fastcodejava Punkte 37539

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.

1 Stimmen

In der Tat erlaubt Java den Zugriff auf statische Mitglieder über Instanzen: siehe Statische Variable in Java

0 Stimmen

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.

1 Stimmen

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?

2voto

g1ji Punkte 1021

Die Antwort auf diese Frage ist einfach: Die Methode oder Variable, die als statisch gekennzeichnet ist, gehört nur zur Klasse, so dass die statische Methode nicht in der Unterklasse geerbt werden kann, weil sie nur zur Oberklasse gehört.

2 Stimmen

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.

0 Stimmen

@DJClayworth für eine ausführliche Antwort sollten Sie diesem Link folgen geeksforgeeks.org/

0 Stimmen

Danke für den Link. Eigentlich bin ich hier, um Neulingen auf der Website zu helfen, um zu erklären, wie die Website für diejenigen funktioniert, die nicht damit vertraut sind, nicht weil ich eine Antwort auf die Frage brauchte.

1voto

MT4000 Punkte 2121

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!";
  }

}

0 Stimmen

Sehr cool, das ist das erste Mal, dass ich von der Programmiersprache Haxe höre :)

1 Stimmen

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.

0 Stimmen

Sie haben Recht, es ist eine klassische Lösung. Ich weiß nicht mehr genau, warum ich mich für die Registrierung entschieden habe, wahrscheinlich hatte ich irgendeinen Gedankengang, der zu diesem Ergebnis führte.

1voto

Rafsan Mobasher Punkte 432

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.

0 Stimmen

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.

0voto

amandeep1991 Punkte 1244

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.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