Comment on peut définir un variable globale en Java? Cela existe en Java? :?:
Version imprimable
Comment on peut définir un variable globale en Java? Cela existe en Java? :?:
bien sur que oui!
voici un exemple de code avec une variable globale
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public class toto { //variables globales private int MaVariableGlobale=0; //constructeur public toto() { } }
Ce n'est pas très global ça, c'est même local à chaque instance de la classe toto.Citation:
Envoyé par djsbens
Pour la rendre globale, il faut y ajouter le mot clef "static".
PS. s'il s'agit d'une constante, rajouter également le mot-clef "final".
Par ailleurs, si vous avez besoin d'une variable globale commune à plusieurs classes, vous pouvez :
- faire hériter toutes ces classes d'une autre contenant une variable statique,
- avoir une classe représentant l'application elle-même (celle qui contient la méthode main peut-être?) contenant cette variable. Dans ce cas, l'encapsulation peut être utile : la méthode set peut appeler une méthode pour toutes les classes/objets impactés par le changement de la variable.
par variable globale j'entendais variable local propre a chaque instance... oups!
Il est vrai que le mot clé static permet de n'avoir qu'une variable commune a chaques instances de la classe.
Sorry!
Oui, il faut ajouter le mot clé static
Affichage:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 class ClassA{ public static int varGA; } public class Test{ public static void main(String args[]){ ClassA a=new ClassA(); a.varGA=100; System.out.println("test var globale: varGA = " + a.varGA); a.varGA=10; System.out.println("test var globale apres motification: varGA = " + a.varGA); } }
test var globale: varGA = 100
test var globale apres motification: varGA = 10
Mais j'ai qd meme une question:
Un warning est affiché car a.varGA n'est pas une manière statique de l'accès à la zone statique de ClassA, qu'est ce que je peux faire? (sauf définir une méthode genre "getVarGA" dans classeA..)
il faut faire
Tu n'es plus obliger d'avoir une instance de classe pour avoir accès a ta variable puisqu'elle devenu static.Code:ClassA.varGA
Pour être correct il faut écrire:
Code:
1
2
3
4
5
6
7
8
9
10
11
12 class ClassA{ public static int varGA; } public class Test{ public static void main(String args[]){ ClassA.varGA=100; System.out.println("test var globale: varGA = " + ClassA.varGA); ClassA.varGA=10; System.out.println("test var globale apres motification: varGA = " + ClassA.varGA); } }
Salut,
Les éléments statique ne sont pas associé à une instance de l'objet. Tu n'a donc pas à créer d'objet ClassA pour y accéder. Il faut que tu utilises le nom de la classe :Citation:
Envoyé par apan
Par contre quel est l'objectif de tout cela ? Parce que dans un langage objet, il y a vraiment très peu de cas où l'on doit manipuler des éléments statique comme cela...Code:
1
2
3
4
5
6
7
8 public class Test{ public static void main(String args[]){ ClassA.varGA=100; System.out.println("test var globale: varGA = " + ClassA.varGA); ClassA.varGA=10; System.out.println("test var globale apres motification: varGA = " + ClassA.varGA); } }
a++
[edit] grillé...
Pour information, j'essai de bannir ce genre de déclarations dans mon code (public static final VAR=xx). Pour ce faire, j'utilise la classe Properties qui permet de stocker de manière compréhensible les variables dans un fichier texte.
Le problème d'apan, si j'ose dire, est peut être qu'il essaie de refaire en java ce qu'il faisait en C.
Exactly, Descent !! Comment tu as deviné ??! :D :D
http://www.developpez.net/forums/viewtopic.php?t=465231
http://www.developpez.net/forums/viewtopic.php?t=465212
:D
Tu devrais aller faire un tour sur cette page, cela te permettrait sans doute de mieux appréhender Java.
:wink:
De plus je pense que de parler de variables globale est une erreur en java.
Variable globale à quoi ? Une classe, un objet, un programme, une instance de programme sur une JVM ?
Bonne question, c'est ce qui me brouille aussi...Citation:
Envoyé par thibaut
Je pense que lorsqu'on parle d'une variable globale, on parle d'une variable accessible a l'ensemble de l'instance d'un programme, d'autant plus ici vu que apan essai de reproduire du C. Et donc en JAVA les variables/constantes statiques me paraissent être utilisable pour ce genre de chose étant donnée qu'elles sont accéssible de partout (a condition qu'elles soient publiques bien entendu).Citation:
Envoyé par thibaut
Parfaitement d'accord !Citation:
Envoyé par thibaut
Un petit memento de vocabulaire :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 // Classe Voiture définit un type voiture public class Voiture { // Variable de classe (partagée par tous les objets de class Voiture) private static int nbVoitureFabriquee = 0; // Variable d'instance (propre à chaque objets de la class Voiture) private int numSerie = 0; // Constructeur vide public Voiture() { // Comme on est dans la classe elle même, // pas besoin de préfixé la variable de classe // par le nom de la classe mais on pourrait le faire (Exemple 1) nbVoitureFabriquee ++; // Comme on est dans la classe elle même, // pas besoin de préfixé la variable d'instance // par this qui signifie instance courante // mais on pourrait le faire (Exemple 2) numSerie = nbVoitureFabriquee; } // Constructeur avec un paramètre public Voiture(int numSerie) { // Exemple 1 : Voiture.nbVoitureFabriquee ++; // Exemple 2 : utilisation de this pour distinguer // la variable d'instance du paramètre de même nom. this.numSerie = numSerie; } // Accesseur (Getter en anglais) public int getNumSerie() { return this.numSerie; } // Mutateur (Setter en anglais) public void setNumSerie(int numSerie) { this.numSerie = numSerie; } // Méthode d'instance public String getNumSerialInString() { // Variable locale de même nom que la variable d'instance String numSerie; // Utilisation de this pour les distinguer numSerie = String.valueOf(this.numSerie); return numSerie; } // Méthode de classe public static int getNbVoitures() { return nbVoitureFabriquee; } // Méthode de classe public static main (String[] args) { // v1 et v2 sont des exemplaires du type Voiture, // On parle d'intances de la classe Voiture ou encore d'objets. Voiture v1, v2; // Création d'une première instance ou // Instanciation d'un premier objet v1 = new Voiture(); System.out.println(v1.getNumSerie()) // -> 1 System.out.println(v1.getNbVoitures()) // -> 1 System.out.println(Voiture.getNbVoitures()) // -> 1 // Création d'une deuxième instance v2 = new Voiture(); System.out.println(v2.getNumSerie()) // -> 2 System.out.println(v2.getNbVoitures()) // -> 2 System.out.println(Voiture.getNbVoitures()) // -> 2 System.out.println(v1.getNumSerie()) // -> 1 System.out.println(v1.getNbVoitures()) // -> 2 System.out.println(Voiture.getNbVoitures()) // -> 2 } }
Dans un programme, une classe "Globale" avec a l'intérieur des variables statiques publiques ou privées et accéssible par des méthodes statiques me parait être accéptable.Citation:
Parfaitement d'accord !Citation:
thibaut a écrit:
De plus je pense que de parler de variables globale est une erreur en java.
Personnellement, afficionado de la programmation orientée objet, je ne procède jamais de la sorte et c'est probablement pour cela que le vocabulaire n'est pas le même.
Ceci étant dit, si tu écris de telles classes qui répondent à tes besoins, en effet, tu peux la qualifier de "globale" ainsi que les variables qu'elle contient.
Tout ca n'est que du vocabulaire...
Je veu dire, par exemple la variable PI de la classe Math peut être considérée comme globale... dans le sens ou on y accéde de n'importe quelle classe. Aprés, on peut aussi dire qu'elle n'est pas globale puisqu'elle est contenue dans la classe Math mais bon...
Pour mon exemple précédent, je doute aussi qu'il y ai beaucoup de gens qui réunissent leur variables statiques dans une classe "Globale"... En général chaque variable statique est associé a un type d'objet spécifique (PI avec les maths ...) et est donc contenue dans la classe en question. C'est donc moyennement objet de réunir plein de variables statiques de types différents dans une classe "Globales".
Mais aprés tout pk pas, chacun sa facon de programmer, c'était uniquement pour dire qu'on appele en général globale une variable accéssible de partout, et donc qu'a ce titre on peut considérer les variables statiques comme des variables globales...
Math.PI n'est pas une variable mais un constante ;)Citation:
Envoyé par vinzzzz
Les variables globales du C se rapprochent des variables statiques des classes. Mais ce n'est pas pour autant que c'est ce qu'il faut utiliser.
Les langages C et Java sont très différents, et il ne faut pas penser en C et coder en Java car on risque d'obtenir quelque chose de très complexe et innaproprié...
Il vaut mieux bien comprendre les notions des langages objets et de Java en général, par exemple : http://java.developpez.com/livres/penserenjava/
a++
PS : A noter que je n'ai rien contre le C (bien au contraire), et que cette remarque vaut également dans l'autre sens (penser en Java et coder en C).
Mille excuses :wink:Citation:
vinzzzz a écrit:
Je veu dire, par exemple la variable PI de la classe Math peut être considérée comme globale...
Math.PI n'est pas une variable mais un constante
Penser en java et coder en C... ca revien a peu prés a coder objet en C, et c'est pas impossible.
L'objectif du topic (si j'avais bien compris) n'était pas de penser en C et coder en JAVA mais trouver un equivalent JAVA pour les variables globale du C. Bien sur il faut avoir compris les notions de POO pour pouvoir aborder le sujet...
Aprés au programmeur de bien utiliser tout ca en fonction de ses besoins :D
Non mais c'est assez complexe à coder... Du coup ce n'est pas forcément la meilleure solution, et on peut se retrouver à débiter du code ou se compliquer la vie alors qu'il existe des solution toute simple...Citation:
Envoyé par vinzzzz
C'est pourquoi je voulais connaitre l'objectif de cela (cf mon premier message), car dans plusieurs cas on peut adopter une solution complètement différente...Citation:
Envoyé par vinzzzz
Par exemple en C la variable globale errno permet de connaitre le code d'erreur de la dernière erreur. En Java il serait abérant de ne pas utiliser le mécanisme d'exception dans ce cas là...
Donc pour moi la question à se poser n'est pas "En C j'utilise cette fonctionnalité, comment faire la même chose en Java ?" mais "Je veux faire quelquechose, comment faire ceci en Java ?"
Mais on connait la fonctionnalité utilisée en C (les variables globles), mais pas son objectif. Et c'est sur ce dernier point qu'on devrait se baser pour donner une réponse...
a++
J'avai croisé quelques sites qui donnaient des moyens de bien programmer objet en C (peut etre pour ceux qui n'ont pas compris que le C++ existe :wink: ) mais comme le C n'est pas objet a la base j'immagine que ca doit pas être si facile...Citation:
Non mais c'est assez complexe à coder... Du coup ce n'est pas forcément la meilleure solution, et on peut se retrouver à débiter du code ou se compliquer la vie alors qu'il existe des solution toute simple...Citation:
Envoyé par vinzzzz
Pour le reste je suis d'accord avec toi.[/quote]
Si mes souvenirs sont bons, l'usage de variable globale en C est déconseillé.
Non, j'infirme.Citation:
Envoyé par afrikha
On utilise même des variables globales d'initialisation par exemple dans ressource.h pour ce qui est del'interface graphique.
Pourtant une trés grande partie des programeurs C déconseille l'usage des variables globales en C. De plus dans pratiquements tous les tutoriels que j'ai pu voir on déconseille également leur usage.Citation:
Non, j'infirme.Citation:
afrikha a écrit:
Si mes souvenirs sont bons, l'usage de variable globale en C est déconseillé.
On utilise même des variables globales d'initialisation par exemple dans ressource.h pour ce qui est del'interface graphique.
Cela ne veut pas dire que c'est interdit mais il semble que ca soit a éviter.
Va faire un tours dans le forum C il y a un topic récent consacré aux globales en C.
Décidemment toi tu portes très mal ton pseudo.Citation:
Envoyé par professeur
Un conseil: renseigne toi un minimum avant de raconter n'importe quoi sur des choses que tu ne connais pas.
Moi, comme objectif du topic, j'avais compris qu'Apan cherchait à définir une variable globale du C en java.Citation:
Envoyé par vinzzzz
Or, dans la suite de la discussion, il m'a paru utile de définir le vocabulaire utilisé en POO puisqu'il n'existe pas dans ce dernier cas de variable globale telle qu'elles existent en C.
Je suis d'accord avec toi. On ne peut pas forcément transposer une fonctionnalité d'un langage procédural en langage objet.Citation:
Envoyé par adiGuba
Un des paradigmes de la POO, c'est l'encapsulation des données qui a pour objectif en autre d'éviter les problèmes rencontrés par les variables globales (que l'on déconseille pour ces mêmes raisons).
Une variable, c'est pour stocker une valeur.
L'interet d'une variable globale dans un langage procédural (vous me corrigerez si je me trompe ou compléterez des oublis) est à mon sens d'avoir un moyen de fournir une même valeur à plusieurs procédures/fonctions autrement qu'un passage par paramètre.
En POO, on regroupe au sein d'un objet, des méthodes (procédures/fonctions) qui travaillent sur des variables d'instances (variable globales).
L'interet de l'objet et donc de l'encapsulation est d'interdire l'acces à ces fameuses variables depuis autre chose que l'objet (et c'est là que ce trouvait un des pbs des var. globales)
Cependant, le probleme vu sous un tel angle a été décalé et au lieu de se demander comment on partage une même valeur entre plusieurs procédures, on s'est demandé ensuite comment partagé une même valeur entre plusieurs objets. Et c'est alors là que les variables de classes prennent leur interêt !
Maintenant, si on veut partager des valeurs entre plusieurs objets, on peut passer par un fichier de propriétés, une base de données, ou un objet fournisseur (singleton).