IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Static - pourquoi et comment ça marche?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Par défaut Static - pourquoi et comment ça marche?
    Bonjour,
    j'ai récupéré un bout de code, et je n'arrive pas à voir pourquoi cela fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Machin {
    	int i = 1;
     
    	static int j = 3;
    	static { j = 2; }
     
    	Machin() {
    		i = 4;
    		j = 5;
    	}
     
    	public static void main(String ch[])
    	{
    		System.out.println(j);
    		new Machin();
    		System.out.println(j);
    	}
    }
    Pourquoi la ligne 5 fonctionne? Qu'est ce qu'elle représente? C'est de la redéfinition? Pourquoi on ne peut pas le faire sans accolade? Et pourquoi ce n'est pas propre au bloc?
    Ce petit machin me perturbe et je n'arrive pas à l'expliquer logiquement avec ce que je connais de la programmation.

    Merci d'avance.

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    c'est un initialiseur static, qui se comporte comme une espèce de "constructeur" pour les champs statiques, au chargement de la classe (juste après les initialisations des variables statiques, dans l'ordre dans lequel ils sont déclarés dans la classe)...

    Très utile lorsqu'on désire déclarer une constante, mais que la valeur de la constante ne peut être que le résultat d'un calcul complexe au runtime.


    http://docs.oracle.com/javase/tutori...O/initial.html

  3. #3
    Membre éclairé Avatar de dafpp
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 345
    Par défaut
    C'est un peu comme les sous-classes interne dans un bloc : ils n'ont pas de référence récupérable et peuvent être utiliser comme sous code?
    On peut mettre ce que l'on veut comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static { int k; for (k=0; k<10; k++); j=k; }
    Pas mal.

    Merci.

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par dafpp Voir le message
    C'est un peu comme les sous-classes interne dans un bloc
    moui et non, ça me dérange pas mal comme formulation, c'est très impréci...

    il n'y a pas vraiment d'équivalent aux blocs statiques. c'est "du code qui s'exécute une seule fois par chargement de classe, juste après l'initialisation des champs statiques". Rien à voir avec des sous-classes internes ou pas, anonymes ou pas...

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Ca ne s'exécute pas après l'initialisation des champs statiques, ca s'exécute pendant (en fonction de la position du bloc au milieu de champs)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    package sandbox;
     
     
     
    public class Machin {
     
    	static int a = 0;
    	static int b = 1;
    	static int c = b;
    	static {b = 5;}
    	static int d = a;
    	static {a = 6;}
    	public static void main(String[] args) {
    		System.out.println("a -> "+a);
    		System.out.println("b -> "+b);
    		System.out.println("c -> "+c);
    		System.out.println("d -> "+d);
     
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a -> 6
    b -> 5
    c -> 1
    d -> 0
    Mais sérieusement, l'utilisation pour "l'initialisation de champs complexes" est pour moi totalement inappropriée. On peut très bien transférer ce code dans une méthode qui est appelée sur la partie droite de l'assignation.

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ca ne s'exécute pas après l'initialisation des champs statiques, ca s'exécute pendant (en fonction de la position du bloc au milieu de champs)
    awé en effet, bon autant pour moi... si on commence à s'appuyer sur ce genre de détails, y'a quand même un gros problème...

    Citation Envoyé par tchize_ Voir le message
    Mais sérieusement, l'utilisation pour "l'initialisation de champs complexes" est pour moi totalement inappropriée. On peut très bien transférer ce code dans une méthode qui est appelée sur la partie droite de l'assignation.
    moui mais c'est pas pareil... une méthode, ça porte un nom, et ça peut s'invoquer n'importe quand et par n'importe quel thread.

    le bloc static lui, ne s'exécute qu'une fois, et ne peut plus être invoqué par la suite, et par un seul thread dans un contexte "sûr" (il est impossible que plusieurs threads fassent l'initialisation d'une même classe en même temps, cf. les spécs de la vm concernant l'initialisation des classes)... d'où une notion d'initialisation (du coup on peut coder différement, avec moins de risques)...


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo