56 votes

Pourquoi statique at-il différentes significations selon le contexte?

Ce que je comprends:

  • Une classe statique s'applique uniquement aux classes imbriquées, et cela signifie que la classe imbriquée n'a pas de références à l'extérieur de la classe.

  • Un champ statique est comme une sorte de variable globale, en ce sens qu'il n'est qu'un exemple de cela, et il est partagé par d'autres membres de la même classe.

  • Une méthode statique signifie qu'il peut être appelé même si l'objet n'a pas été instanciée.

Je prends une introduction à Java cours et suis en train de ciment ma connaissance, ainsi que d'essayer de comprendre pourquoi les différents mots-clés n'ont pas été utilisés pour signifier différentes significations.

70voto

Pace Points 10393

Vos exemples sont tout à fait correct, cependant, ils partagent tous une caractéristique commune. Le mot statique signifie qu'une instance englobante n'est pas nécessaire.

  • Seulement une statique à l'intérieur de la classe peut exister sans l'enfermer instance. Par exemple, si vous avez une classe Foo et un non-statique à l'intérieur de la classe Bar alors vous ne pouvez pas créer une instance de Bar extérieur d'une instance de Foo.

  • Une méthode statique signifie que vous n'avez pas besoin d'une instance de la classe à appeler la méthode. Vous pouvez appeler String.format sans réellement String exemple par exemple.

  • Un champ statique continuera d'exister même sans une instance de la classe. Si votre Foo classe a un counter champ est statique, vous pouvez y accéder sans jamais créer une instance de la Foo classe.

Considérer, comme une mise au point qu'une interface peut avoir des classes statiques, les champs statiques, et des méthodes statiques. Toutefois, il ne peut pas avoir le non-version statique de l'une de ces choses (en ignorant les méthodes par défaut qui sont en quelque sorte des ad-hoc avait dans le concept). C'est parce que vous ne pouvez jamais créer une instance de l'interface, donc il ne pourrait jamais être une instance englobante.

Vous pouvez également déclarer intérieure interfaces, les annotations et les énumérations à être statique, bien que le mot clé dans cette affaire est entièrement redondantes (par exemple similaire à la déclaration d'une méthode de l'interface abstraite). Les Interfaces, les annotations et les énumérations, n'ont aucun rapport avec une classe englobante pour commencer de manière statique ne peut pas vraiment prendre ça.

Une dernière byzantine point. Si vous ne statique à l'importation (import static pack.age.Foo.*), vous serez en mesure de faire sans réserve les références à tous les éléments statiques dans une classe (y compris les interfaces, les annotations et les énumérations, indépendamment de si oui ou non ils sont en redondance marqué statique).

19voto

scottb Points 1766

Pourquoi ne statiques ont des significations différentes selon le contexte? Pourquoi n'a pas ne sont pas différents mots-clés utilisés?

Il n'a pas vraiment de sens différents.

Vous pouvez prendre l' static mot-clé pour indiquer le suivant partout où il peut être rencontré:

"sans égard ou de la relation d'un cas particulier"

  • Un champ statique est l'un qui appartient à la classe plutôt qu'à un cas particulier.

  • Une méthode statique est définie sur la classe et n'a aucune notion que ce soit d' this. Une telle méthode peut accéder aux champs d'instance dans un cas particulier, sauf lorsqu'une instance est passé.

  • Un membre statique de la classe est une classe imbriquée qui n'a aucune notion de sa classe englobante et n'a pas de relation particulière de l'instance de sa classe englobante, sauf si une telle instance est passé (comme un argument à son constructeur).

16voto

dave Points 1305

De Base de Java par Cay Horstmann:

Le terme "statique" a une curieuse histoire. Au premier abord, le mot-clé static a été introduit dans C à désigner les variables locales qui ne disparaissent pas lorsqu'un bloc est fermé. Dans ce contexte, le terme "statique" prend tout son sens: La variable reste autour et il est toujours là lorsque le bloc est entré de nouveau. Alors statique obtenu un deuxième sens en C, pour désigner les variables et fonctions globales qui ne peut pas être accessible à partir d'autres fichiers. Le mot-clé static était tout simplement réutilisé, pour éviter l'introduction d'un nouveau mot-clé. Enfin, C++ réutilisé le mot-clé pour un troisième, non, interprétation-pour désigner les variables et les fonctions qui appartiennent à une classe, mais pas pour tout objet particulier de la classe. C'est le même sens que le mot a dans Java.

9voto

David Hammen Points 17912

Java hérite de C++ et C. Dans ces langues, static a deux significations. Une variable locale (portée de la fonction) qualifiée static a un sens quelque peu similaire à celle d'un champ statique dans une classe. Java cependant ne prend pas en charge ce contexte de "statique". La qualification de la variable ou de la fonction en tant que static en C ou C++ à la portée de fichier signifie "Ssh! Ne dites pas à l'éditeur de liens!". Java ne supporte pas ce que cela signifie d' static, soit.

En anglais, le même mot peut avoir plusieurs significations selon le contexte. Rechercher tous les plus couramment utilisées mot dans le dictionnaire, vous trouverez de multiples définitions de ce mot. Certains mots n'ont pas seulement des significations multiples, qu'ils ont de multiples parties du discours. "Contre", par exemple, peut être un nom, un verbe, un adjectif ou un adverbe, selon le contexte. D'autres mots peuvent avoir des significations contradictoires, selon le contexte. "Excuses" peut signifier "je suis désolé!", ou il peut signifier "je ne suis pas désolé du tout!" Un premier exemple de ce dernier est "Un Mathématicien a présenté ses Excuses" par G. H. Hardy. L'anglais n'est pas unique à cet égard; la même chose s'applique à n'importe quelle langue les humains utilisent pour communiquer les uns avec les autres. En tant qu'humains, nous sommes habitués à des mots ayant des significations différentes selon le contexte.

Il y a un conflit inhérent entre le fait d'avoir trop peu de mots clés et de trop nombreux dans un langage informatique. Lisp, de suite, et smalltalk sont très belles langues avec très peu, le cas échéant, des mots-clés. Ils ont quelques caractères spéciaux, par exemple, d'ouvrir et de fermer les parenthèses en lisp. (Divulgation complète: je l'ai programmé dans chacun de ces trois langues, et j'ai adoré.) Il y a un problème ici: Bonne chance à lire le code que vous avez vous-même écrit de six mois après le fait. Même plus de chance de convertir ce code à quelqu'un d'autre. En conséquence, ces langues ont aussi un nombre assez limité d'adhérents. D'autres langues, aller plus haut et de la réserve d'un grand nombre de mots "comme mots-clés." (Divulgation complète: je ai été forcé de programme dans ces langues, et j'ai détesté ça.)

Trop peu ou trop de mots clés dans un langage informatique des résultats de la dissonance cognitive. Ayant le même mot clé contextes différents, dans différents ne constitue pas, car en tant qu'humains, nous sommes habitués à cela.

6voto

BeeOnRope Points 3617

Tous les usages de la statique ont quelques points communs comme je le vois dans tous les cas, ils signifient que la classe/terrain/la méthode est moins attachée à l'instance de la classe que ce ne serait le cas sans statique. Certainement l'équivalence entre les champs et méthodes statiques, en particulier, devrait être claire: ils sont la façon de déclarer singleton (par-chargeur de classe) des champs et des méthodes qui fonctionnent sur ces champs, d'une manière similaire à des objets globaux dans d'autres langues.

Peut-être alors l'utilisation de la statique pour les classes imbriquées n'est pas, bien évidemment, dans le même esprit, mais elle ne part l'aspect que vous n'avez pas besoin d'une instance de la classe conteneur à utiliser ce concept.

Donc je ne vois pas comme étant particulièrement incohérent.

Une réponse à la question plus générale de pourquoi les mots clés sont ré-utilisés pour apparemment différentes fins dans un langage de programmation est que, souvent, les fonctionnalités sont introduites en tant qu'une langue évolue - mais il est difficile d'ajouter de nouveaux mots-clés depuis brisent souvent les programmes existants qui peut-être utilisé que comme un identificateur. Java, par exemple, en fait, se réserve le mot-clé const même si il n'est pas utilisé dans la langue, peut-être pour permettre l'expansion future!

Cette réticence à ajouter de nouveaux mots clés conduit souvent à une surcharge anciens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X