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 :

Static et non static. Comment faire?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut Static et non static. Comment faire?
    bonjour,

    J'ai un code on ne peux plus simple (simplifié au minimum)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MyLNReader2 {
    	public class LineCounter 
    	{
    		LineCounter (String f){
    		}
    	}
     
    	public static void main(String[] args) {
    		new LineCounter("abc");
    	}
    }
    J'ai un problème suivant :
    MyLNReader2.java:17: non-static variable this cannot be referenced from a static context
    new LineCounter("abc");
    ^
    1 error


    1/ Pourquoi?
    2/ Comment faire pour créer autant de LineCounter que args.legth et passer des [I]args à la place de "abc" ?

    Merci

  2. #2
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    Bonjour,

    La méthode main est statique donc elle ne peut pas contenir de référence faire des attributs non statiques.

    Tu as donc deux solutions pour résourdre ton problème :
    - Soit tu déclares la classe LineCounter en tant que membre statique de la MyLNReader2.

    - Soit extrais la classe LineCounter de la classe MyLNReader2 pour en faire une classe non membre (une classe normale). Pour cela tu crée un nouveau fichier :
    Fichier LineCounter.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class LineCounter {
     public LineCounter (String f){
     }
    }
    Fichier MyLNReader2.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class MyLNReader2 {
     public static void main(String[] args) {
      new LineCounter("abc");
     }
    }
    Pour ton second problème, tu peux faire une boucle for dans la méthode main :
    Fichier MyLNReader2.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class MyLNReader2 {
     public static void main(String[] args) {
      for (int i = 0; i < args.length; i++) {
        new LineCounter(args[i]);
      }
     }
    }
    A+
    Gronono

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Par défaut
    Citation Envoyé par gronono Voir le message
    Bonjour,

    La méthode main est statique donc elle ne peut pas contenir de référence faire des attributs non statiques.

    Tu as donc deux solutions pour résourdre ton problème :
    - Soit tu déclares la classe LineCounter en tant que membre statique de la MyLNReader2.

    - Soit extrais la classe LineCounter de la classe MyLNReader2 pour en faire une classe non membre (une classe normale). Pour cela tu crée un nouveau fichier :
    Fichier LineCounter.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class LineCounter {
     public LineCounter (String f){
     }
    }
    Fichier MyLNReader2.java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class MyLNReader2 {
     public static void main(String[] args) {
      new LineCounter("abc");
     }
    }
    A+
    Gronono
    Effectivement avec 2 fichiers séparés ça marche. Mais je ne comprends pas trop pourquoi.
    1/ Quelle est la difference avec une classe séparée et une classe interne (à part l'accès)?

    2/ Si je déclare ma classe LineCounter interne static dans ce cas là je ne dois pas l'appeler avec new LineCounter("abc"); ?

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par cmako Voir le message
    1/ Quelle est la difference avec une classe séparée et une classe interne (à part l'accès)?
    Une classe interne non-static est lié à une instance de la classe parente, c'est ce qui te permet d'appeler la classe parente en utilisant "NomDeLaClasse.this". Ce lien implique qu'on ne puisse créer de classe Fille que depuis une instance de la classe Parent (et donc pas depuis une méthode static comme main()) :
    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 Parent {
     
    	public class Fille {
    		public Parent getParent() {
    			// retourne l'instance de la classe 
    			// parente lié à cette classe :
    			return Parent.this;
    		}
    	}
     
     
    	public Fille createFille() {
    		// Crée une classe fille lié à cette instance :
    		return new Fille();
    	}
     
    }




    Par contre si la classe interne est static, elle n'est lié à aucune instance de la classe parente et peut être utilisé normalement comme toutes les autres classes (mais elle conserve des relations privilégié avec sa classe parente en ce qui concerne la visibilité des attributs et méthodes).


    Citation Envoyé par cmako Voir le message
    2/ Si je déclare ma classe LineCounter interne static dans ce cas là je ne dois pas l'appeler avec new LineCounter("abc"); ?
    Si justement...

    a++

  5. #5
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    En déclarant une classe à l'intérieur d'une autre, tu fais d'elle une classe membre. Elle n'est accessible que par la classe dans laquelle elle a été déclaré (comme pour les attributs).
    A chaque nouvelle instance de ta classe correspond alors une déclaration de la classe incluse.

    Si tu déclare la classe interne statique, alors elle est déclaré une et une fois pour toutes les instances de la classe englobante.

    Si tu déclare la classe dans un autre fichier, alors ta classe est partagé par les autres classes et n'existe qu'une seule déclaration.

    Le choix de l'emplacement de la déclaration est une question de visibilité vis à vis des autres classes.
    Si une classe doit être utilisée par plusieurs autres classes, alors elle sera placé dans un fichier externe.
    Par contre si la classe n'est utilisée que dans une autre classe, elle peut être déclarée en classe interne. Le plus souvent elle sera statique pour éviter d'avoir une déclaration par instance de la classe englobante.


    En espérant avoir était clair.
    A+
    Gronono

    Edit : Grilled par adiGuba

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Bonjour,
    Si tu préfères garder ta classe interne non-static, voici la syntaxe pour en créer une instance depuis une classe externe ou une méthode static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyLNReader2 {
    	public class LineCounter 
    	{
    		LineCounter (String f){
    		}
    	}
    	
    	public static void main(String[] args) {
    		MyLNReader2.LineCounter lc = new MyLNReader2().new LineCounter("abc");
    	}
    }
    Une instance de la classe interne non-static doit toujours être liée à une instance de la classe englobante.

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gronono Voir le message
    En déclarant une classe à l'intérieur d'une autre, tu fais d'elle une classe membre. Elle n'est accessible que par la classe dans laquelle elle a été déclaré (comme pour les attributs).
    Heu... Non cela dépend de la visibilité que tu lui donnes (public, protected, package ou private). Le fait qu'elle soit interne ou pas n'a aucune incidence là dessus (si ce n'est qu'une classe interne peut être déclaré protected ou private).

    Citation Envoyé par gronono Voir le message
    A chaque nouvelle instance de ta classe correspond alors une déclaration de la classe incluse.

    Si tu déclare la classe interne statique, alors elle est déclaré une et une fois pour toutes les instances de la classe englobante.
    Non : la déclaration des classes est bien unique dans les deux ! Il n'y a qu'un lien entre les instances créées dans le cas d'une classe interne non-static...

    Citation Envoyé par gronono Voir le message
    Le choix de l'emplacement de la déclaration est une question de visibilité vis à vis des autres classes.
    Si une classe doit être utilisée par plusieurs autres classes, alors elle sera placé dans un fichier externe.
    Par contre si la classe n'est utilisée que dans une autre classe, elle peut être déclarée en classe interne. Le plus souvent elle sera statique pour éviter d'avoir une déclaration par instance de la classe englobante.
    Une classe interne permet d'avoir des relations privilégié avec la classe parente, comme l'accès aux attributs et méthodes private, ce qui peut être intéressant...

    Mais dans tous les cas il n'y a pas de déclaration multiple...


    Citation Envoyé par manblaizo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		MyLNReader2.LineCounter lc = new MyLNReader2().new LineCounter("abc");
    Argh cette syntaxe est vraiment affreuse

    Franchement c'est à éviter : si tu te retrouves à faire des choses comme cela c'est que ta classe interne ne devrait pas avoir de liens aussi fort avec la classe parente... bref il faudrait qu'elle soit static !

    a++

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

Discussions similaires

  1. transformer une methode static a non static
    Par maaizou dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 22/03/2011, 09h14
  2. Du non static context au static context
    Par JeanNoel53 dans le forum NetBeans
    Réponses: 14
    Dernier message: 29/12/2010, 19h28
  3. Crystal report et dataset non typé, comment faire?
    Par Machine Head dans le forum VB.NET
    Réponses: 5
    Dernier message: 06/04/2010, 17h25
  4. Réponses: 3
    Dernier message: 21/02/2010, 19h09
  5. [Debutant]difference entre static et non static
    Par jeremypd dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 07/03/2008, 08h13

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