web-dev-qa-db-fra.com

Pourquoi une méthode statique est-elle considérée comme une méthode?

J'écris une explication pour du code pour un cours, et j'ai accidentellement utilisé les mots method et function de manière interchangeable. J'ai décidé de revenir en arrière et de corriger le libellé, mais je suis tombé dans 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 si il opère sur une instance d'une classe (il peut effectuer des effets secondaires sur l'instance qui la rendent impure).

Il y a bonne discussion ici sur le sujet. Notez que selon les définitions de la réponse acceptée, un method statique devrait en fait être une fonction car une instance n'est jamais transmise implicitement et n'a accès à aucun membre d'instance.

Cela dit, l'esprit ne devrait-il pas être statique methods en fait des fonctions?

Par leur définition, ils n'agissent pas sur des instances particulières d'une classe; ils ne sont "liés" à la classe qu'en raison de leur relation. J'ai vu quelques bons sites qui se réfèrent à des sous-programmes statiques comme des "méthodes" ( Oracle , Fredosaurus , ProgrammingSimplified ), donc soit ils oublient tous la terminologie, ou il me manque quelque chose (je suppose que c'est la dernière).

Je voudrais m'assurer d'utiliser la bonne formulation.
Quelqu'un peut-il clarifier cela?

133
Carcigenicate

Cette citation de 8.4.3.2 peut aider:

Une méthode déclarée static est appelée méthode de classe .

Une méthode non déclarée static est appelée une méthode d'instance [...].

  • Méthodes de classe: associées à une classe.
  • Méthodes d'instance: associées à une instance.

Java veut juste que vous "pensiez orienté objet". De plus, 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.

120
Radiodef

La réponse simple est que lorsque Java a décidé de tout appeler une "méthode", ils ne se sont pas souciés de la distinction entre une fonction et une méthode en informatique théorique.

79
Bitcoin M

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 dérivé C des fonctions globales 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. Les "méthodes statiques" ont donc une portée limitée par leur conception contrairement aux fonctions globales.

26
Thorsten S.

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: objectif C, Smalltalk et JLS - pour n'en nommer que quelques-uns.

17
Mike Clark

En informatique fonction correspond clairement à une méthode statique. Mais la "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

Les membres de données et les membres de méthode ont deux espaces de noms distincts: .x et .x () peuvent coexister.

La raison en est donc que, comme l'a dit le philosophe Ludwig Wittgenstein, le langage est un outil avec des contextes différents. "Méthode" est un surnom de Nice dans la citation ci-dessus pour classer un "membre".

11
Joop Eggen

Votre pensée est juste et elle a du sens. Ce n'est tout simplement pas une terminologie établie dans la communauté Java. Permettez-moi d'expliquer quelques éléments internes qui peuvent aider à comprendre pourquoi la terminologie subsiste.

Java est un langage orienté objet basé sur les classes. Une méthode est toujours membre d'une classe ou d'une instance (il s'agit également d'une instruction générale valable 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 directement cette méthode à partir d'une classe, vous devez créer une instance. Chaque instance fait référence à cette méthode. Vous pouvez remplacer une définition de méthode avec la même signature de méthode exacte (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 pouvez uniquement appeler cette méthode directement depuis la classe, 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 remplacer exactement la même signature de méthode lorsque la méthode est déclarée statique, car il n'existe 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.

9
Ely

Voici une autre interprétation de la terminologie, en utilisant Scala comme mnémonique:
Dans Scala vous avez objects, qui sont des instances singleton d'une classe définie implicitement 1 .

Selon votre définition, nous pouvons appeler ces sous-routines appartenant aux méthodes object, car elles 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 Java classe A accèdent aux mêmes membres que l'instance Scala singleton, qui selon votre définition méritent alors d'être appelées ( statique) méthodes de classe A.

7
mucaho

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 des classes A.doTheSameStaticMethod () et ClassB.doTheSameStaticMehod () dépendent de la classe. Dans ce cas, la fonction est impuissante.

Chaque classe a un objet pour le représenter qui est une instance d'une sous-classe de la classe Class. Les méthodes statiques sont en fait 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 forme de champs statiques, ils ne sont donc pas limités à de simples fonctions (sans état). Ce sont des méthodes.

1
Bohemian