J'écris une explication pour un code pour un cours, et j'utilise accidentellement les mots method
et de function
manière interchangeable. J'ai décidé de revenir en arrière et de corriger le libellé, mais je suis tombé sur un trou dans ma compréhension.
D'après ce que je comprends, un sous-programme est un function
s'il n'agit pas sur une instance d'une classe (son effet est limité à son entrée / sortie explicite), et est un method
s'il opère sur une instance d'une classe (il peut porter effets secondaires sur l'instance qui la rendent impure).
Il y a une bonne discussion ici sur le sujet. Notez que d'après les définitions de réponse acceptées, un statique method
devrait en fait être une fonction car une instance n'est jamais transmise implicitement et n'a accès aux membres d'aucune instance.
Avec ceci est l'esprit cependant, ne devrait pas statique methods
être réellement des fonctions?
De par leur définition, ils n'agissent pas sur des instances particulières d'une classe; ils ne sont "liés" à la classe qu'à cause de leur relation. J'ai vu quelques bons sites qui font référence aux sous-programmes statiques comme des «méthodes» ( Oracle , Fredosaurus , ProgrammingSimplified ), donc soit ils ignorent tous la terminologie, soit il me manque quelque chose (je suppose que c'est la dernière) .
Je voudrais m'assurer que j'utilise le bon libellé.
Quelqu'un peut-il clarifier cela?
la source
Réponses:
Cette citation de 8.4.3.2 peut aider:
Java veut simplement que vous "pensiez orienté objet". En outre, les méthodes statiques ont accès à une portée environnante qui peut inclure l'état. D'une certaine manière, la classe est comme un objet lui-même.
la source
@FunctionalInterface
annotation et avec 1 méthode sous le capot. Un lambda n'est qu'un sucre syntaxique et à cet égard il n'y a rien de nouveau.La réponse simple est que lorsque Java a décidé d'appeler tout une «méthode», il ne se souciait pas de la distinction entre une fonction et une méthode en informatique théorique.
la source
Les méthodes statiques ne sont pas exactement des fonctions, la différence est subtile, mais importante.
Une méthode statique utilisant uniquement des paramètres d'entrée donnés est essentiellement une fonction.
Mais les méthodes statiques peuvent accéder à des variables statiques et à d'autres fonctions statiques (utilisant également des variables statiques) de sorte que les méthodes statiques peuvent avoir un état qui est fondamentalement différent d'une fonction qui est par définition sans état . (ADDENDA: Bien que les programmeurs ne soient souvent pas aussi stricts avec l'utilisation de «fonction» comme définition, une fonction stricte en informatique ne peut accéder qu'aux paramètres d'entrée). Donc, en définissant ce cas d'accès aux champs statiques, il n'est pas valide de dire que les méthodes statiques sont toujours des fonctions.
Une autre différence qui justifie l'utilisation de la "méthode statique" est que vous pouvez définir en C des fonctions globales dérivées et des variables globales accessibles partout. Si vous ne pouvez pas accéder à la classe qui contient des méthodes statiques, les méthodes sont également inaccessibles. Ainsi, les «méthodes statiques» sont limitées dans leur portée par conception contrairement aux fonctions globales.
la source
En Java, une classe définie par l'utilisateur est en fait une instance d'une sous-classe de java.lang.Class.
En ce sens, les méthodes statiques sont attachées à une instance d'une classe conceptuelle: elles sont attachées à une instance d'une sous-classe de java.lang.Class.
Dans cet esprit, le terme «méthode de classe» (un autre nom pour les méthodes statiques de Java) commence à avoir un sens. Et le terme «méthode de classe» peut être trouvé à de nombreux endroits: Objective C, Smalltalk et JLS - pour n'en nommer que quelques-uns.
la source
En informatique, la fonction correspond clairement à une méthode statique. Mais «méthode» d'une classe est un peu générique, comme «membre» (membre de champ, membre de méthode). Il y a des libellés comme
Donc, la raison en est que, comme l'a dit le philosophe Ludwig Wittgenstein, le langage est un outil avec des contextes différents. "Méthode" est un joli surnom dans la citation ci-dessus pour catégoriser un "membre".
la source
Votre pensée est juste et elle a du sens. Ce n'est tout simplement pas une terminologie établie dans la communauté Java. Laissez-moi vous expliquer quelques éléments internes qui peuvent aider à comprendre pourquoi la terminologie subsiste.
Java est un langage orienté objet basé sur des classes. Une méthode est toujours membre d'une classe ou d'une instance (il s'agit d'une instruction générale valable également pour d'autres langages de programmation). Nous pensons que la classe et l'instance sont les deux objets.
Méthode d'instance (dynamique)
Vous ne pouvez pas appeler cette méthode directement depuis une classe, vous devez créer une instance. Chaque instance fait référence à cette méthode. Vous pouvez écraser une définition de méthode avec exactement la même signature de méthode (lors du sous-classement), c'est-à-dire que la référence pointe vers une méthode différente (qui a la même signature, mais peut avoir un corps de méthode différent). La méthode est dynamique.
Méthode de classe (statique)
Vous ne pouvez invoquer cette méthode que depuis la classe directement, c'est-à-dire que vous n'avez pas besoin de créer une instance de cette classe. Il n'y a qu'une seule définition globale de cette méthode dans l'ensemble du programme. Vous ne pouvez pas écraser exactement la même signature de méthode lorsque la méthode est déclarée statique, car il n'y a qu'une seule définition valide pour l'ensemble du programme. Notez que la méthode est membre de l'objet de classe lui-même, les instances ont toutes la même référence unique (et fixe) à cette méthode.
la source
Voici une autre interprétation de la terminologie, utilisant Scala comme mnémonique:
Dans Scala, vous avez des
object
s, qui sont des instances singleton d'une classe implicitement définie1 .Selon votre définition, nous pouvons appeler ces sous-programmes appartenant aux
object
méthodes , car ils opèrent sur une seule instance de la classe.De plus, l'objet définira également la classe A et créera toutes les méthodes de l'objet A en tant que méthodes statiques sur la classe A (pour l'interfaçage avec Java) [2] .
Par conséquent, nous pouvons dire que les méthodes statiques de la classe Java A accèdent aux mêmes membres que l'instance singleton Scala, qui, selon votre définition, méritent alors d'être appelées méthodes (statiques) de classe A.
la source
object
référence a beaucoup de sens. Je vous remercie.Bien sûr, la principale différence est que la méthode peut utiliser des champs statiques, pas seulement des paramètres de méthode. Mais il y en a un autre: le polymorphisme! Les résultats de l'évaluation Les classes A.doTheSameStaticMethod () et ClassB.doTheSameStaticMehod () dépendront de la classe. Dans ce cas, la fonction est impuissante.
la source
Chaque classe a un objet pour la représenter qui est une instance d'une sous-classe de la
Class
classe. Les méthodes statiques sont en réalité des méthodes d'instance sur ces objets qui sont des instances d'une sous-classe de Class. Ils ont accès à l'état sous la forme de champs statiques, ils ne sont donc pas limités à de simples fonctions (sans état). Ce sont des méthodes.la source