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

Langage Java Discussion :

Utilisation du mot-clef "static"


Sujet :

Langage Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut Utilisation du mot-clef "static"
    Bonjour,

    j'ai une petite question sur cette structure

    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
    public MyAppSqlConfig {
    private static final SqlMapClient sqlMap;
    static {
    try {
    String resource = “com/ibatis/example/sqlMap-config.xml”;
    Reader reader = Resources.getResourceAsReader (resource);
    sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
    } catch (Exception e) {
    // If you get an error at this point, it doesn’t matter what it was. It is going to be
    // unrecoverable and we will want the app to blow up hard so we are aware of the
    // problem. You should always log such errors and re-throw them in such a way that
    // you can be made immediately aware of the problem.
    e.printStackTrace();
    throw new RuntimeException (“Error initializing MyAppSqlConfig class. Cause: ” + e);
    }
    }
    public static SqlMapClient getSqlMapInstance () {
    return sqlMap;
    }
    }
    C'est un exemple de classe utilitaire pour utiliser iBatis. Mais ma question porte sur la syntaxe, et pas sur iBatis.

    On voit à la troisième ligne un bloc de code précédé du mot-clef static. Or j'ai appris dans mes cours il y a quelque temps que dans une classe on mettait des attributs et des méthodes. Or ce n'est ni l'un ni l'autre.

    Donc qu'est-ce que c'est ? Un bloc qui est éxécuté au chargement de la classe par la JVM ? Si oui à quel moment ? Avant ou après l'appel au constructeur ? Durée de vie des objets créés à l'intérieur ?

    Merci pour vos réponses, même partielles.

  2. #2
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 257
    Points : 308
    Points
    308
    Par défaut
    Lors d'une instanciation de classe, les initialisateurs statiques sont exécutés après que les données statiques soient allouées et avant le constructeur.

    Les intialisateurs statiques permettent de lancer des traitements uniquement pour la première instance d'une classe, car ils ne sont exécutés qu'une seule fois.

    Les initialisateurs statiques se révélent également utiles pour l'initialisation complexes de variables statiques.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par sir_gcc
    Un bloc qui est éxécuté au chargement de la classe par la JVM ? Si oui à quel moment ?
    Tu te répond toi-même : ce code est exécuté au chargement de la classe par la JVM.


    Citation Envoyé par sir_gcc
    Avant ou après l'appel au constructeur ?
    Ce code est exécuté une seule fois au chargement de la classe.

    Il n'a rien à voir avec les constructeurs...
    Par contre il existe des blocs d'initialisations qui sont exécuté avant chaque appel de constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Classe {
     
    	{
    		// Bloc d'initialisation
    	}
     
    }
    Citation Envoyé par sir_gcc
    Durée de vie des objets créés à l'intérieur ?
    Ils obéissent aux mêmes règles que tous les autres objets : tant qu'une référence est accessible ils sont conservé en mémoire


    Exemple :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    class Parent {
     
    	static {
    		System.out.println("Parent : bloc static{}");
    	}
     
    	{
    		System.out.println("Parent : bloc d'initialisation {}");
    	}
     
    	public Parent() {
    		System.out.println("Parent : constructeur");
    	}
     
    }
     
    class Fille extends Parent {
     
    	static {
    		System.out.println("Fille : bloc static{}");
    	}
     
    	{
    		System.out.println("Fille : bloc d'initialisation {}");
    	}
     
    	public Fille() {
    		super(); // implicite si absent
    		System.out.println("Fille : constructeur");
    	}
     
    }
     
    public class Main {
     
    	public static void main(String[] args) throws Exception {
    		System.out.println("main()");
    		System.out.println("-------------------------------------");
    		new Fille();
    		System.out.println("-------------------------------------");
    		new Fille();
    	}
    }
    Ce qui donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    main()
    ---------------------------------
    Parent : bloc static{}
    Fille : bloc static{}
    Parent : bloc d'initialisation {}
    Parent : constructeur
    Fille : bloc d'initialisation {}
    Fille : constructeur
    ---------------------------------
    Parent : bloc d'initialisation {}
    Parent : constructeur
    Fille : bloc d'initialisation {}
    Fille : constructeur
    a++

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Points : 228
    Points
    228
    Par défaut
    Merci,

    j'avais déjà ma petite idée, mais une confirmation ne fait jamais de mal

    A+

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

Discussions similaires

  1. WP 7 et 8 : utiliser les mots clefs await/async et Task<T>
    Par rolandl dans le forum Windows Phone
    Réponses: 2
    Dernier message: 27/03/2013, 09h40
  2. Question sur l'utilisation du mot réservé static
    Par flash2590 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 00h20
  3. mot-clef static
    Par keil dans le forum C++
    Réponses: 8
    Dernier message: 25/01/2006, 17h11

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