Ich schreibe eine Erklärung für einen Code für einen Kurs und habe die Wörter versehentlich method
und function
austauschbar verwendet. Ich beschloss, noch einmal hinüberzugehen und den Wortlaut zu korrigieren, stieß aber auf ein Loch in meinem Verständnis.
Soweit ich function
weiß , ist eine Unterroutine eine, wenn sie nicht auf eine Instanz einer Klasse einwirkt (ihre Wirkung ist auf ihre explizite Eingabe / Ausgabe beschränkt), und eine, method
wenn sie auf eine Instanz einer Klasse angewendet wird (sie kann übertragen werden) Nebenwirkungen auf die Instanz, die sie unrein machen).
Hier gibt es eine gute Diskussion zu diesem Thema. Beachten Sie, dass nach den Definitionen der akzeptierten Antwort eine Statik method
tatsächlich eine Funktion sein sollte, da eine Instanz niemals implizit übergeben wird und keinen Zugriff auf die Mitglieder einer Instanz hat.
Sollte Static nicht methods
tatsächlich Funktionen sein?
Nach ihrer Definition handeln sie nicht auf bestimmte Instanzen einer Klasse. Sie sind nur aufgrund ihrer Beziehung an die Klasse "gebunden". Ich habe einige gut aussehende Websites gesehen, die statische Unterprogramme als "Methoden" bezeichnen ( Oracle , Fredosaurus , ProgrammingSimplified ). Entweder übersehen sie alle die Terminologie, oder ich vermisse etwas (meine Vermutung ist die letztere). .
Ich möchte sicherstellen, dass ich den richtigen Wortlaut verwende.
Kann jemand das klären?
quelle
Antworten:
Dieses Zitat aus 8.4.3.2 kann helfen:
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 selbst.
quelle
@FunctionalInterface
Annotation und mit 1 Methode unter der Haube. Ein Lambda ist nur syntaktischer Zucker und in dieser Hinsicht gibt es nichts Neues.Die einfache Antwort lautet: Als Java beschloss, alles als "Methode" zu bezeichnen, kümmerte es sie nicht um die Unterscheidung zwischen einer Funktion und einer Methode in der theoretischen Informatik.
quelle
Statische Methoden sind nicht genau Funktionen, der Unterschied ist subtil, aber wichtig.
Eine statische Methode, bei der nur bestimmte Eingabeparameter verwendet werden, ist im Wesentlichen eine Funktion.
Statische Methoden können jedoch auf statische Variablen und andere statische Funktionen zugreifen (auch unter Verwendung statischer Variablen), sodass statische Methoden einen Zustand haben können, der sich grundlegend von einer Funktion unterscheidet, die per Definition zustandslos ist . (ADDENDUM: Während Programmierer mit der Verwendung von "Funktion" als Definition oft nicht so streng umgehen, kann eine strenge Funktion in der Informatik nur auf Eingabeparameter zugreifen.) Wenn Sie diesen Fall des Zugriffs auf statische Felder definieren, ist es nicht gültig zu sagen, dass statische Methoden immer Funktionen sind.
Ein weiterer Unterschied, der die Verwendung der "statischen Methode" rechtfertigt, besteht darin, dass Sie in C abgeleitete 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 in ihrem Umfang konstruktionsbedingt begrenzt.
quelle
In Java ist eine benutzerdefinierte Klasse tatsächlich eine Instanz einer Unterklasse von java.lang.Class.
In diesem Sinne statische Methoden sind auf eine Instanz einer konzeptuellen Klasse angehängt: sie zu einer Instanz einer Unterklasse von java.lang.Class angebracht ist.
In diesem Sinne beginnt der Begriff "Klassenmethode" (ein alternativer Name für die statischen Methoden von Java) Sinn zu machen. Und der Begriff "Klassenmethode" ist an vielen Stellen zu finden: Ziel C, Smalltalk und JLS - um nur einige zu nennen.
quelle
In der Informatik ist die Funktion eindeutig einer statischen Methode zugeordnet. Aber "Methode" einer Klasse ist ein bisschen generisch, wie "Mitglied" (Feldmitglied, Methodenmitglied). Es gibt Formulierungen wie
Der Grund ist also, dass Sprache, wie der Philosoph Ludwig Wittgenstein sagte, ein Werkzeug mit unterschiedlichen Kontexten ist. "Methode" ist ein netter Spitzname im obigen Zitat, um ein "Mitglied" zu kategorisieren.
quelle
Dein Denken ist richtig und es macht Sinn. Es ist einfach 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 Anweisung, 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 von einer Klasse aus aufrufen, sondern müssen eine Instanz erstellen. Jede Instanz verweist auf diese Methode. Sie können eine Methodendefinition mit genau derselben Methodensignatur (bei Unterklassen) überschreiben, dh 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, dh 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.
quelle
Hier ist eine weitere Interpretation der Terminologie, bei der Scala als Mnemonik verwendet wird:
In Scala haben Sie
object
s, die Singleton-Instanzen einer implizit definierten Klasse sind1 .Gemäß Ihrer Definition können wir diese Unterroutinen aufrufen, die zu gehören
object
Methoden , 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 der Java-Klasse A auf dieselben Mitglieder wie die Scala-Singleton-Instanz zugreifen, die gemäß Ihrer Definition den Namen (statisch) verdienen. Methoden der Klasse A bezeichnet werden sollten.
quelle
object
Referenz sehr sinnvoll. Danke dir.Der Hauptunterschied besteht natürlich darin, dass die Methode statische Felder verwenden kann, nicht nur Methodenparameter. Aber es gibt noch einen - Polymorphismus! Ergebnisse der Bewertung Die Klassen A.doTheSameStaticMethod () und ClassB.doTheSameStaticMehod () hängen von der Klasse ab. In diesem Fall ist die Funktion machtlos.
quelle
Jede Klasse verfügt über ein Objekt, das eine Instanz einer Unterklasse der
Class
Klasse darstellt. Statische Methoden sind wirklich Instanzmethoden für diese Objekte, die Instanzen einer Unterklasse der Klasse sind. Sie haben Zugriff auf den Status in Form von statischen Feldern, sodass sie nicht nur (zustandslose) Funktionen sind. Sie sind Methoden.quelle