- Aucune classe est une île.
- Il n'y a pas de boules d'argent, du moins c'est très vrai en programmation.
- L'optimisation prématurée est la racine de tous les maux.
- En Java, nous n'avons pas de variables globales. Nous n'avons que des variables de classe, des variables d'instance et des variables de méthode.
[Modifier]
Je suis en train d'expliquer ici mon dernier point. En fait, en apportant la discussion, cela se passe dans les commentaires ci-dessous, au poste actuel.
Regardez d'abord cela, an SO thread of C#. Là les gens sont aussi ce qui suggère la même chose, ce qui est,
Alors, on y va.
correction: Les classes ont une portée globale et toutes les variables de classe ont donc une portée globale. D'où devrait être appelé global.
Contre-réaction: Toutes les classes n'ont pas une portée globale. Une classe peut être package-private
. Par conséquent, les variables static
ne seront pas visibles en dehors du package. Par conséquent, ne devrait pas être appelé comme global. En outre, les classes peuvent être imbriquées, donc peuvent également être private
et peuvent certainement avoir des variables static
mais celles-ci ne seraient pas appelées globales.
cornue:public
classes sont globalement scope, et donc toutes les variables de classe sont globalement scope.
contre-réplique: Pas exactement.Je voudrais déplacer l'argument précédent ici mais sur un niveau variable. Peu importe si la classe elle-même est public
. Les variables peuvent être protected
, package-private
et private
. Par conséquent, les variables static
ne seront pas globales dans ce cas.
Maintenant, si vous voulez appeler public static
variable dans public static
classe, comme globale, puis l'appeler par tous les moyens. Mais considérez ceci, quand vous créez un nouveau ClassLoader
(en tant qu'enfant du bootstrap ClassLoader
) et chargez une classe que vous avez déjà chargée. Ensuite, cela se traduit par une "très nouvelle copie de la classe" - complète avec son propre nouvel ensemble de static
s. Très "non-global", en effet. Cependant, nous n'utilisons pas le mot global en Java parce qu'il a tendance à confondre les choses et ensuite nous devons venir avec beaucoup d'explications juste pour que tout soit clair. Les gens aiment à juste titre expliquer la caractéristique des variables global
en Java par static
variables. Il n'y a pas de problème à cela. Si vous avez un problème/code dans une autre langue et que vous utilisez des variables globales et que vous devez convertir ce code en Java, alors vous utiliserez probablement la variable static
comme alternative.
Quelques exemples que je tiens à rendre ici
Quand j'ai commencé Java, les instructeurs aiment expliquer la différence de passage variable de type d'objet et variables primitives. Et ils utilisent constamment le terme objets sont pass-by-reference
, tandis que les primitives sont pass-by-value
. Les étudiants ont trouvé cette explication assez confuse. Donc, nous avons eu l'idée que tout ce qui est en Java est la valeur de transmission. Et nous expliquons que pour les objets, les références sont des valeurs pass-by. Cela devient beaucoup plus clair et simple.
De même, il existe des langages prenant en charge l'héritage multiple. Mais Java ne le fait pas, encore une fois sans doute parlant. Mais les gens ont tendance à expliquer cette caractéristique en utilisant interface
s. Ils l'expliquent en implémentant de nombreuses interfaces par classe et l'appellent multiple-inheritance. C'est parfaitement bien. Mais ce que la classe, en réalité, reçoit en héritant d'un certain nombre d'interfaces. Franchement parlant, rien. Pourquoi?
. Parce que toutes les variables dans les interfaces sont implicitement public
, final
et static
, ce qui signifie apparemment que ceux-ci appartiennent à la classe et tout le monde peut y accéder. Maintenant nous pouvons dire que peut-être il y aura quelques inner class
dans l'interface, alors la classe implémentant l'interface l'aura. Mais encore une fois ce sera static
implicitement et appartiendra à l'interface. Par conséquent, tout ce que la classe obtiendra sont des méthodes. Et n'oublions pas seulement la définition et le contrat qui dit, "la classe implémentant cette interface doit fournir l'implémentation de toutes les méthodes ou se déclarer abstract
". Par conséquent, cette classe n'aura que des responsabilités et rien de plus. Mais cela résout nos problèmes de manière brillante.
Bottom line
Par conséquent, nous disons
- Il n'y a pas de variables globales en Java
- Java ne supporte pas l'héritage multiple, mais quelque chose comme ça peut être réalisé en mettant en œuvre plusieurs interfaces.Et cela fonctionne vraiment
- Il n'y a rien de passage par référence en Java, mais les références sont passent par valeur
Maintenant, j'aime le site quelques endroits
- Java ne ne supporte pas les variables globales, universellement accessibles. Vous pouvez obtenir les mêmes types d'effets avec des classes qui ont des variables statiques [Ref]
- Cependant,
extern
dans ObjectiveC n'est pas une alternative à une variable statique de portée de classe en Java, en fait c'est plus comme une variable globale ... donc utilisez avec mise en garde. [Ref]
- Au lieu des variables globales comme dans C/C++, Java permet des variables dans une classe à déclarer statique [Ref]
- De plus, l'utilisation excessive des membres statiques peut conduire à des problèmes similaires à ceux rencontrés dans des langues comme C et C++ qui prennent en charge les variables globales et les fonctions globales. [Ref]
Tous ces éléments déduisent une seule et même idée. Ce qui est Java ne supporte pas les variables globales.
Enfer, j'ai écrit ça. Désolé les gens.
Réponse courte: ce n'est pas grave. Réponse plus longue: c'est vraiment pas grave. La lisibilité, la fiabilité et la maintenabilité sont les objectifs, pas les micro-optimisations. En outre, Java n'a pas de variables globales. Votre exemple illustre des variables d'instance. Si vous voulez toujours savoir, configurez un test et chronométrez-le. –
+1 pour "test it", Jonathon. Il est fastidieux de lire et de relire les gens qui posent des questions auxquelles on aurait pu répondre avec une dizaine de minutes de travail. –