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 :

Classe statique


Sujet :

Langage Java

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut Classe statique
    Bonjour à tous,

    Je regardais un exemple de Sun :
    http://java.sun.com/j2se/1.5.0/docs/guide/nio/example/Ping.java

    Et dans cet exemple, Sun déclare des classes static à l'interieur d'une classe publique. J'aurais aimé en savoir plus sur les propriétés qu'une classe possède quand on la déclare avec comme static (visibilité, ...) ?

    Ce type de classe, m'a l'air bien utile pour des développements avec des thread, ou des parseur XML par exemple.

  2. #2
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Je sais pas si ca va t'aider mais tu peut toujours regarder la faq

  3. #3
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Bonjour,
    je dirais que la visibilité de la classe interne est définie par le plus restrictif des mots clés associés aux classes englobante et interne.

    L'importance du mot clé static n'est pas dans la visibilité. Dans le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class MyClass {
      static class StaticInnerClass { ... }
      class InnerClass { ... }
    }
     
    MyClass o1 = new MyClass();
    MyClass o2 = new MyClass();
    o1.StaticInnerClass et o2.StaticInnerClass sont deux écritures malpropres de la classe MyClass.StaticInnerClass.

    Par contre, o1.InnerClass et o2.InnerClass sont deux classes différentes. Si je ne me trompe pas, le instanceof devrait renvoyer un test négatif.

    [EDIT] Enfin, l'appel à MyClass.InnerClass ne devrait pas compiler.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  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
    Salut,


    Les classes internes conservent toujours une référence vers l'instance de la classe conteneur. Elles ne peuvent donc être instancié qu'avec une instance de la classe parente (la plupart du temps cela est transparent lorsque la classe est conteneur dans une des méthodes de la classe conteneur).

    Ainsi si tu as cette architecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Conteneur {
    	class Intern {
    	}
    }
    dans la classe Intern tu as accès à l'instance de la classe Conteneur en utilisant Conteneur.this.


    A l'inverse une classe interne static n'est pas lié à une instance de la classe Conteneur, mais elle a quand même accès aux éléments protected et private de la classe conteneur...

    Je ne sais pas si je suis bien clair...

    a++

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    Désolé wichtounet, je viens de regarder dans la FAQ et il n'y a rien...

    En fait, je voudrais pouvoir utiliser ce type de classe comme des classes "private" à l'intérieur de classes public.

    Par exemple pour déclarer un parser XML (classe héritant de DefaultHandler), je voudrais qu'il n'y est que la seule classe l'utilisant qui puisse voir ce fameux handler...

    A priori ça à l'air d'être le cas, ce message était la juste pour une confirmation. A la rigueur, il faudrait que je poste une demande de modification de la définition du mot clé static dans le post dédié à la FAQ.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    Citation Envoyé par adiGuba


    A l'inverse une classe interne static n'est pas lié à une instance de la classe Conteneur, mais elle a quand même accès aux éléments protected et private de la classe conteneur...
    Salut,
    Tu dis qu'une classe interne static n'est pas lié a une instance mais qu'elle a acces au element protected et private de la classe .
    J'imagine que tu parle d'element static sinon de quel instance ces elements proviendrons ??

    sinon jeje99 je remet le lien :

    http://java.developpez.com/faq/java/...motsClesStatic

    parce qu'a priori une reponse dans la faq qui repond à
    Que signifie le mot-clé static ?
    correspond a ce que tu cherche !!!!!!
    UML avec VIOLET

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    J'ai compris jusqu'a
    A l'inverse une classe interne static n'est pas lié à une instance de la classe Conteneur, mais elle a quand même accès aux éléments protected et private de la classe conteneur...
    Je ne comprend pas ce que tu veux dire dans cette phrase...

    Sinon dans la FAQ (en tout cas à l'adresse http://java.developpez.com/faq/java/...otsClesStatic) On ne fait pas référence à l'utilisation du mot clef static devant le mot clef class.

  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 FreshVic
    Tu dis qu'une classe interne static n'est pas lié a une instance mais qu'elle a acces au element protected et private de la classe .
    J'imagine que tu parle d'element static sinon de quel instance ces elements proviendrons ??
    Par exemple, cela peut provenir d'instance passé en paramètre d'une méthode...

    Citation Envoyé par FreshVic
    parce qu'a priori une reponse dans la faq qui repond à
    Que signifie le mot-clé static ?
    correspond a ce que tu cherche !!!!!!
    Pas tout à fait parce que la question de la FAQ traite des méthodes et des bloc static, mais pas des classes internes statiques... Il faudrait écrire une explication clair (la mienne ne l'est pas tellement c'est vrai) et la soumettre dans le thread de la FAQ...



    Ce bout de code sera peut-être plus compréhensible :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    public class Conteneur {
     
    	private final String name;
     
    	public Conteneur (String pName) {
    		this.name = pName;
    	}
     
     
    	public class Intern {
    		public void method() {
    			// Une classe interne a accès a la reference du conteneur
    			System.out.println ( "Intern : " + Conteneur.this.name );
    		}
    	}
     
     
    	public static class StaticIntern {
    		public void method(Conteneur conteneur) {
    			// Une classe interne static a accès aux éléments private
    			// Mais elle n'est pas lié à une reference d'un objet.
    			// On ne peut donc pas utiliser Conteneur.this
    			System.out.println ( "StaticIntern : " + conteneur.name );
    		}
    	}
     
     
    	public Intern getIntern () {
    		// Intern est lié à l'instance courante du Conteneur
    		return new Intern();
    	}
     
     
    	public StaticIntern getStaticIntern () {
    		// StaticIntern est indépendante de l'instance courante
    		return new StaticIntern();
    	}
     
     
    	public static void main (String[] args) {
    		Conteneur c1 = new Conteneur("C1");
    		Conteneur c2 = new Conteneur("C2");
     
    		Intern intern = c1.getIntern();
    		StaticIntern staticIntern = c1.getStaticIntern();
     
    		intern.method(); // affichera C1 car les classes sont liés
    		staticIntern.method(c1); // affichera C1 car on le passe en paramètre
    		// mais les deux classes ne sont pas lié...
     
    		c2.getIntern().method(); // affichera C2
    		c2.getStaticIntern().method(c1); // affichera C1
    	}
     
     
    }
    a++

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    509
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 509
    Points : 568
    Points
    568
    Par défaut
    Ha oui c'est plus clair !!
    Effectivement la faq ne repond pas a ce cas d'utilisation du mot clé static
    Merci .
    UML avec VIOLET

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    Je viens de télécharger The Java™ Language Specification Third Edition

    A priori c'est le paragraphe 8.1.3 qui nous intéresse et qui répond à ma question cruciale de ce topic.

    Donc voici le résumé que je propose (j'attend vos validations) :

    Il faut d'abord expliquer la notion de classe interne. Donc une classe interne, c'est une classe déclarée à l'intérieur d'une autre classe de la même manière que pour les autres membres classique (attributs, méthodes).
    exemple de déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Outer{
    	class Inner extends {
    	}
    }
    elles peuvent accèder de manière transparente aux autres membres de l'instance de la classe dont elle fait partie. Comme par exemple c'est montré dans le code ci-desous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Outer{
    	int i = 100;
    	class Inner extends {
    		int k = i ;
    	}
    }

    Il faut aussi savoir qu'une classe interne ne peut pas comporter de contexte static, par exemple le code ci dessous n'est pas valide à cause de la déclaration de variable static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Outer{
    	class Inner extends {
    		static int i = 0;
    	}
    }

    utilisation du mot clef static devant une classe interne

    Cette classe passe alors dans le contexte statique, c'est à dire qu'elle ne peut plus accèder aux variable dynamiques de la classe dont elle est membre, mais seulement aux variables statiques de cette dernière. Par contre, elle peut déclarrer des variables statique mais aussi des variables non statique (dynamique??).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Outer {
    	static class {
    		static toto = 3;
    		int i = 2;
    	}
    }

  11. #11
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Citation Envoyé par jeje99
    Par contre, elle peut déclarrer des variables statique mais aussi des variables non statique (dynamique??).
    Par contre, elle peut déclarer des variables statiques mais aussi des variables non statiques (d'instance).

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Une autre utilisation des classes internes (publiques) statiques est au niveau conceptuel : cela permet de regrouper des implementations differentes dans un meme espace de nommage/package (le nom de la classe ou de l'interface parente).

    Si tu regardes du cote des classes Rectangle2D.Float, Rectangle2D.Double ; mais aussi Ellipse2D.Float, Ellipse2D.Double, ... Tu pourras remarquer que Double et Float etendent toutes les 2 la classe abstraite Rectangle2D (on aurait aussi pu faire ca avec une interface) et proposent a l'utilisateur des implementations concretes. Les designers de Java2D auraient pu aussi bien faire des classes normales separees dans java.awt.geom (genre FloatRectangle2D, DoubleRectangle2D) mais bon d'un autre cote au niveau logique et design c'est un peu plus classieux de faire comme c'est actuellement (Rectangle, l'implementation avec des entiers est a part car cette classe date d'avant la creation de Java2D ; elle a donc ete "retrofitee", comme d'autres classes originaires de l'AWT, lors de la creation de Java2D pour etendre elle-meme Rectangle2D).

    En ayant un peu marre d'avoir 36.000 classes pour mes renderers pour les listes, tables et tree ; j'ai finit par adopter un format similaire :

    ex:

    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 interface FooCellRenderer {
      public static class List 
        extends DefaultListCellRenderer implements FooCellRenderer {
        ...
      }
     
      public static class Tree 
        extends DefaultTreeCellRenderer implements FooCellRenderer {
        ...
      }
     
      public static class Table 
        extends DefaultTableCellRenderer implements FooCellRenderer {
        ...
      }
    }
    Un autre interet des classes statiques internes est tout simplement une economie de memoire en evitant des duplicats du code meme de la classe interne qui pourraient etre lies a chacune des instances de la classe contenante (donc la meme utilite que les methodes statiques*).

    *Le code de la methode est centralise avec le code de la classe et non-pas lie a chaque instances.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 84
    Points : 75
    Points
    75
    Par défaut
    C'est pas mal tout ça, je vais modifier ma réponse en prennant en compte vos commentaires et poster tout ça dans le topic FAQ du forum (normalement ce soir si tout va bien).

    Et encore un résolu ...

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

Discussions similaires

  1. [PHP-JS] Classe statique en PHP4
    Par Neuromancien2 dans le forum Langage
    Réponses: 1
    Dernier message: 04/05/2007, 11h22
  2. Pb difficile a expliquer, classe statique
    Par seb.49 dans le forum Services Web
    Réponses: 1
    Dernier message: 29/03/2007, 15h22
  3. Tableau de constantes dans une classe statique
    Par Nico_stras dans le forum C#
    Réponses: 4
    Dernier message: 05/03/2007, 20h18
  4. Classe statique en C++ ?
    Par oodini dans le forum C++
    Réponses: 9
    Dernier message: 18/10/2006, 13h31
  5. classe statique objet
    Par drKzs dans le forum Langage
    Réponses: 8
    Dernier message: 04/09/2006, 11h58

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