wake-up-neo.com

Warum wird eine statische Methode als Methode angesehen?

Ich schreibe eine Erklärung für einen Code für einen Kurs und habe versehentlich die Wörter method und function synonym verwendet. Ich beschloss, den Wortlaut noch einmal zu korrigieren, geriet aber in ein Loch in meinem Verständnis.

Soweit ich weiß, ist eine Unterroutine eine function, wenn sie nicht auf eine Instanz einer Klasse einwirkt (ihre Auswirkung ist auf die explizite Eingabe/Ausgabe beschränkt), und eine method, wenn Es wird auf eine Instanz einer Klasse angewendet (es kann Nebenwirkungen auf die Instanz ausüben, die sie unrein machen).

Es gibt ein gute Diskussion hier zum Thema. Beachten Sie, dass nach den Definitionen der akzeptierten Antwort ein statisches method eigentlich eine Funktion sein sollte, da eine Instanz niemals implizit übergeben wird und keinen Zugriff auf die Mitglieder einer Instanz hat.

Sollte statisch methods also eigentlich keine Funktion sein?

Nach ihrer Definition handeln sie nicht auf bestimmte Instanzen einer Klasse. Sie sind nur aufgrund ihrer Beziehung an die Klasse "gebunden". Ich habe ein paar gut aussehende Sites gesehen, die statische Subroutinen als "Methoden" bezeichnen ( Oracle , Fredosaurus , ProgrammingSimplified ), also auch Sie übersehen alle die Terminologie, oder ich vermisse etwas (meine Vermutung ist das letztere).

Ich möchte sicherstellen, dass ich den richtigen Wortlaut verwende.
Kann jemand das klären?

133
Carcigenicate

Dieses Zitat aus 8.4.3.2 kann helfen:

Eine als static deklarierte Methode wird als Klassenmethode bezeichnet.

Eine Methode, die nicht als static deklariert ist, wird als Instanzmethode [...] bezeichnet.

  • Klassenmethoden: einer Klasse zugeordnet.
  • Instanzmethoden: einer Instanz zugeordnet.

Java möchte nur, dass Sie "objektorientiert denken". Statische Methoden haben auch Zugriff auf einen umgebenden Bereich, der den Status enthalten kann. In gewisser Weise ist die Klasse wie ein Objekt.

120
Radiodef

Die einfache Antwort lautet: Als Java) sich entschied, alles als "Methode" zu bezeichnen, war ihnen die Unterscheidung zwischen einer Funktion und einer Methode in der theoretischen Informatik egal.

79
Bitcoin M

Statische Methoden sind nicht genau Funktionen, der Unterschied ist subtil, aber wichtig.

Eine statische Methode, die nur bestimmte Eingabeparameter verwendet ist im Wesentlichen eine Funktion.

Statische Methoden können jedoch auf statische Variablen und andere statische Funktionen (auch unter Verwendung statischer Variablen) zugreifen, sodass statische Methoden u. U. ein state haben, das sich grundlegend von einer per Definition stateless Funktion unterscheidet . (ADDENDUM: Während Programmierer oft nicht so streng mit der Verwendung von "function" als Definition sind, kann eine strenge Funktion in der Informatik nur auf Eingabeparameter zugreifen.) Wenn Sie also diesen Fall des Zugriffs auf statische Felder definieren, können Sie nicht sagen, dass statische Methoden immer Funktionen sind.

Ein weiterer Unterschied, der die Verwendung der "statischen Methode" rechtfertigt, besteht darin, dass Sie in C Ableitungen globale Funktionen und globale Variablen definieren können, auf die überall zugegriffen werden kann. Wenn Sie nicht auf die Klasse zugreifen können, die statische Methoden enthält, können Sie auch nicht auf die Methoden zugreifen. Daher sind "statische Methoden" im Gegensatz zu globalen Funktionen konstruktionsbedingt in ihrem Umfang begrenzt.

26
Thorsten S.

In Java ist eine benutzerdefinierte Klasse eine Instanz einer Unterklasse von Java.lang.Class.

In diesem Sinne sind statische Methoden are an eine Instanz einer konzeptuellen Klasse angehängt: Sie sind an eine Instanz einer Unterklasse von Java.lang.Class angehängt.

In diesem Sinne macht der Begriff "Klassenmethode" (ein alternativer Name für die statischen Methoden von Java) allmählich Sinn. Und der Begriff "Klassenmethode" ist vielerorts zu finden: Objective C, Smalltalk und JLS - um nur einige zu nennen.

17
Mike Clark

In der Informatik entspricht Funktion eindeutig einer statischen Methode. Aber "Methode" einer Klasse ist ein bisschen generisch, wie "Mitglied" (Feldmitglied, Methodenmitglied). Es gibt Formulierungen wie

Daten- und Methodenmitglieder haben zwei separate Namensräume: .x und .x () können nebeneinander existieren.

Der Grund dafür ist, dass die Sprache, wie der Philosoph Ludwig Wittgenstein sagte, ein Werkzeug mit unterschiedlichen Kontexten ist. "Methode" ist ein Nizza-Spitzname im obigen Zitat, um ein "Mitglied" zu kategorisieren.

11
Joop Eggen

Ihr Denken ist richtig und es macht Sinn. Es ist nur keine etablierte Terminologie in der Java Community. Lassen Sie mich einige Interna erklären, die helfen können zu verstehen, warum die Terminologie existiert.

Java ist eine klassenbasierte objektorientierte Sprache. Eine Methode ist immer Mitglied einer Klasse oder Instanz (Dies ist eine allgemeine Aussage, die auch für andere Programmiersprachen gültig ist). Wir denken, dass Klasse und Instanz beide Objekte sind.

Instanzmethode (dynamisch)

Sie können diese Methode nicht direkt aus einer Klasse aufrufen, sondern müssen eine Instanz erstellen. Jede Instanz verweist auf diese Methode. Sie können eine Methodendefinition mit genau derselben Methodensignatur (beim Unterklassen) überschreiben, d. H. Die Referenz verweist auf eine andere Methode (die dieselbe Signatur hat, aber einen anderen Methodenkörper haben kann). Die Methode ist dynamisch.

Klassenmethode (statisch)

Sie können diese Methode nur direkt von der Klasse aus aufrufen, d. H. Sie müssen keine Instanz dieser Klasse erstellen. Es gibt nur eine globale Definition dieser Methode im gesamten Programm. Sie können nicht genau dieselbe Methodensignatur überschreiben, wenn die Methode als statisch deklariert ist, da nur eine Definition für das gesamte Programm gültig ist. Beachten Sie, dass die Methode Mitglied des Klassenobjekts selbst ist. Die Instanzen haben alle denselben eindeutigen (und festen) Verweis auf diese Methode.

9
Ely

Hier ist eine andere Interpretation der Terminologie, wobei Scala als Mnemonik verwendet wird:
In Scala= haben Sie objects, die Singleton-Instanzen einer implizit definierten Klasse sind 1 .

Gemäß Ihrer Definition können wir diese Unterroutinen aufrufen, die zu den object -Methoden gehören, da sie auf einer einzelnen Instanz der Klasse ausgeführt werden.
Zusätzlich definiert das Objekt auch Klasse A und erstellt alle Methoden in Objekt A als statische Methoden in Klasse A (für die Schnittstelle mit Java)[2 ] .

Daher können wir sagen, dass die statischen Methoden von Java Klasse A auf dieselben Member wie die Scala Singleton-Instanz zugreifen, die Ihrer Definition nach dann einen Aufruf verdienen ( statische) Methoden der Klasse A.

7
mucaho

Der Hauptunterschied ist natürlich - Methode kann statische Felder verwenden, nicht nur Methodenparameter. Aber es gibt noch einen weiteren - Polymorphismus! Ergebnisse der Bewertung Die Klassen A.doTheSameStaticMethod () und ClassB.doTheSameStaticMehod () hängen von der Klasse ab. In diesem Fall ist die Funktion ohnmächtig.

Jede Klasse hat ein Objekt zur Darstellung, das eine Instanz einer Unterklasse der Klasse Class ist. Statische Methoden sind tatsächlich Instanzmethoden für diese Objekte, die Instanzen einer Unterklasse von Class sind. Sie haben Zugriff auf Zustände in Form von statischen Feldern, sodass sie nicht auf (zustandslose) Funktionen beschränkt sind. Sie sind Methoden.

1
Bohemian