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 :

Appelle de fonction avant création d'objet [plus d'info]


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 34
    Points
    34
    Par défaut Appelle de fonction avant création d'objet [plus d'info]
    bonjour,
    J'aurai simplement plus d'informations :
    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
    public class MyClass
    {
    	\\0
    	public sousClass() {
    		System.out.println("objet en creation");
    	}
     
    	\\1
    	{
    		System.out.println(" | R1 | ");
    	}
     
    	\\2
    	static
    	{
    		System.out.println(" | R2 | ");
    	}
    }
    Quand je crée un objet MyClass \\2 puis \\1 et enfin \\0 sont appellés...
    c'est a dire :" | R2 | | R1 | objet en creation"

    La seule chose à retenir est t'elle cette ordre ? ou c'est plus profond que ca ?

    PS: Comment s'appelle cette technique d'appeler une fonction automatiquement avant la création d'une fonction ?
    Martin MAGAKIAN
    Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 151
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par diva_69 Voir le message
    bonjour,
    J'aurai simplement plus d'informations :
    La seule chose à retenir est t'elle cette ordre ? ou c'est plus profond que ca ?

    PS: Comment s'appelle cette technique d'appeler une fonction automatiquement avant la création d'une fonction ?
    Martin MAGAKIAN
    Merci
    Salut,
    Et çà compiles ?
    Telle que tu poses ta question tu ne risques pas d'avoir une réponse satisfaisante.
    Tu veux peut être parler de l'initialisation statique. Sois plus claire

  3. #3
    Membre chevronné
    Profil pro
    Développeur Java Indépendant
    Inscrit en
    Mai 2007
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java Indépendant

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 333
    Points : 2 061
    Points
    2 061
    Par défaut
    Nan je pense pas que sa compile, il n'y a pas de constructeur, la procédure sousClasse n'a pas de void et les autres n'ont pas de nom...

    Si tu veux appeler des fonction pendant la création de l'objet, tu écris les appels de fonction dans le constructeur.

  4. #4
    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
    Citation Envoyé par zag-yoshi Voir le message
    Nan je pense pas que sa compile, il n'y a pas de constructeur, la procédure sousClasse n'a pas de void et les autres n'ont pas de nom...
    La seule erreur vient du nom du constructeur qui ne correspond pas à la classe (sousClass au lieu de MYClass) et les commentaire qui sont inversé (\\ au lieu de //).

    Le reste est tout à fait correcte et fonctionne parfaitement :
    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
    public class MyClass {
     
    	// 0
    	public MyClass() {
    		System.out.println("objet en creation");
    	}
     
    	// 1
    	{
    		System.out.println(" | R1 | ");
    	}
     
    	// 2
    	static {
    		System.out.println(" | R2 | ");
    	}
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	// 2
    	static {
    		System.out.println(" | R2 | ");
    	}
    Ceci est un bloc d'initialisation static qui sera exécuté une seule fois lors du chargement de la classe par le ClassLoader.
    Ce code est exécuté en même temps que les initialisations des attributs static...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	// 1
    	{
    		System.out.println(" | R1 | ");
    	}
    Ceci est un bloc d'initialisation d'instance qui sera exécuté à chaque création d'objet juste avant le constructeur.
    Ce code est exécuté en même temps que les initialisations des attributs d'instance...


    a++

  5. #5
    Membre actif Avatar de ze_corsaire
    Inscrit en
    Décembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Décembre 2007
    Messages : 240
    Points : 273
    Points
    273
    Par défaut
    Je ne suis pas fan des blocs statiques, on ne sait jamais quand ils seront appelés précisément, ceci dépendant du compilo.
    Exemple : un appel à
    peut provoquer ou non le déclenchement des blocs statiques, selon le compilateur choisi (je crois me souvenir que jikes les chargeait et pas javac) donc pour ce qui en est de ton ordre de lancement, tu peux être confronté aux mêmes types de surprise .



  6. #6
    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,


    Un appel à MyClass.class ne provoque pas l'exécution des blocs static. Par contre il me semble que c'était le cas dans les anciens JRE (version 1.4 ou inférieur je ne suis plus sûr).

    a++

  7. #7
    Membre actif Avatar de ze_corsaire
    Inscrit en
    Décembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Décembre 2007
    Messages : 240
    Points : 273
    Points
    273
    Par défaut
    Ecoute, je suis sûr de mon coup et je peux t'assurer que le
    provoque le chargement des champs et portions de code statiques si celui-ci a été compilé avec javac, mais pas si la compilation s'est effectuée avec jikes, et donc indépendamment de la jre.


  8. #8
    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
    Citation Envoyé par ze_corsaire Voir le message
    provoque le chargement des champs et portions de code statiques si celui-ci a été compilé avec javac,
    Je viens de tester avec javac 1.5 et 1.6 et avec les JVM 1.5 et 1.6 et je ne retrouve pas ce comportement (le code statique n'est pas exécuté).

    a++

  9. #9
    Membre actif Avatar de ze_corsaire
    Inscrit en
    Décembre 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Décembre 2007
    Messages : 240
    Points : 273
    Points
    273
    Par défaut
    Autant pour moi, maintenant que tu le dis, c'était plutôt jikes (installé sur nos machines de dév) qui les chargeait et javac (en prod) qui ne le faisait pas, d'où certains bugs causés par la non-initialisation des variables statiques.

    Merci pour ta rigueur.

  10. #10
    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
    Citation Envoyé par ze_corsaire Voir le message
    Autant pour moi, maintenant que tu le dis, c'était plutôt jikes (installé sur nos machines de dév) qui les chargeait et javac (en prod) qui ne le faisait pas, d'où certains bugs causés par la non-initialisation des variables statiques.
    Jikes n'est peut-être pas en cause... s'il génère du code 1.4 !

    En effet je viens de retrouver la note et c'est bien une modification apparut avec Java 5.0 : http://java.sun.com/j2se/1.5.0/compa...y.html#literal

    J'ai vérifié en compilant avec java et les options -target 1.4 -source 1.4 et le bloc static est chargé lors du MyClass.class...


    a++

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/04/2012, 00h02
  2. Réponses: 6
    Dernier message: 08/08/2011, 01h07
  3. [Framework] appeler une fonction avant
    Par robert_trudel dans le forum Spring
    Réponses: 21
    Dernier message: 21/04/2008, 20h15
  4. Réponses: 3
    Dernier message: 10/08/2007, 13h04
  5. Réponses: 11
    Dernier message: 16/10/2005, 20h21

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