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 :

Méthode non-statique dans un contexte statique : erreur de compilation


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Points : 15
    Points
    15
    Par défaut Méthode non-statique dans un contexte statique : erreur de compilation
    Bonsoir,

    En lisant le cours Java de Bruce Eckel et en faisant les exercices proposés, je fais évidemment l'erreur du débutant qui m'amène à un message d'erreur :
    non-static method storage(java.lang.String) cannot be referenced from a static context.


    Je cherche à obtenir le nombre d'octets occupés par un String en mémoire, mon code est le suivant :

    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
    //: Storage2.java
     
    import java.util.*;
     
    public class Storage {
     
    	int storage(String s) {
    		return s.length();
    	}
     
    	public static void main(String[] args) {
    		System.out.println(storage(args[0]));
    	}
     
    }
    Alors évidemment, cette erreur de newbee est archi-documentée, mais sur des exemples différents du mien ; et comme ce n'est que ce soir que je me suis mis au Java, j'ai du mal à appliquer les réponses fournies à mon cas.

    Je vois que lorsque je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static int storage(String s) {
    le programme compile et fonctionne convenablement. J'aimerais savoir :

    1. Si c'est "propre" de faire ça ;
    2. S'il y a d'autres façons de le faire, en déclarant par exemple une instance Storage dans la déclaration même de la classe Storage (j'ai cru voir que c'était possible) ;
    3. Si c'est parce que la méthode storage n'agit pas sur une instance Storage, que ça marche quand je déclare static la méthode storage.

    Voici mes questions, merci d'avance pour vos réponses !

    Endreillie

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par endreillie Voir le message
    1. Si c'est "propre" de faire ça ;
    Euh... Je... Pfffff...
    Disons que quand on apprend, il vaut mieux ne pas commencer avec du static, et ne jamais en mettre ailleurs que pour faire public static void main(String[] args)

    Mais plus tard, tu apprendras que cette méthode avait parfaitement le droit d'être static, oui, puisqu'elle n'a aucun besoin de s'exécuter dans le contexte d'une instance de Storage.
    En fait, tu apprendras surtout que cette méthode n'a pas de raison d'exister, puisqu'au lieu de l'appeler, il suffit de faire s.length(). Alors static ou pas static, hein, aucun des deux n'est le mieux. Pas là est le mieux.

    2. S'il y a d'autres façons de le faire, en déclarant par exemple une instance Storage dans la déclaration même de la classe Storage (j'ai cru voir que c'était possible) ;
    En fait, en construisant une instance de la classe Storage dans le main(), et en travaillant sur cette instance.
    C'est en général ce qu'on fait, plus ou moins directement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static void main(String[] args) {
      Storage store = new Storage();
      System.out.println(store.storage(args[0]));
    }
    3. Si c'est parce que la méthode storage n'agit pas sur une instance Storage, que ça marche quand je déclare static la méthode storage.
    Ma foi, c'est très bien dit, oui. Il semble que tu aies compris la chose.

    Je cherche à obtenir le nombre d'octets occupés par un String en mémoire, mon code est le suivant :
    Pour information, String.length() renvoie le nombre de chars contenus dans la String, et un char tient sur deux octets.
    De plus, String étant un objet, la taille qu'une instance occupe en mémoire n'est pas précisément définie, mais c'est plus que juste ses chars. Toutefois, plus une String est longue, plus elle contient de chars, alors que le reste de son occupation mémoire est de même taille pour n'importe quelle instance.

    Mais bon, c'était pas la question.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Points : 15
    Points
    15
    Par défaut
    Merci thelvin pour cette réponse !

    De plus, String étant un objet, la taille qu'une instance occupe en mémoire n'est pas précisément définie, mais c'est plus que juste ses chars. Toutefois, plus une String est longue, plus elle contient de chars, alors que le reste de son occupation mémoire est de même taille pour n'importe quelle instance.
    Tu veux dire que plus la chaîne est longue, plus la mémoire occupée par autre chose que des chars devient négligeable devant la mémoire occupée par les chars ?

    Cordialement,
    endreillie

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par endreillie Voir le message
    Tu veux dire que plus la chaîne est longue, plus la mémoire occupée par autre chose que des chars devient négligeable devant la mémoire occupée par les chars ?
    Oui. En fait, la taille occupée par autre chose que des chars ne varie pas en fonction du nombre de chars. Il me semble.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/09/2013, 14h11
  2. [PDO] Utilisation de PDO dans un contexte statique
    Par Rony Rauzduel dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 17/05/2013, 09h44
  3. [Thread] appel de méthodes non-synchronized dans une méthode synchronized
    Par dr23fr dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 24/06/2008, 22h47
  4. Réponses: 20
    Dernier message: 14/06/2008, 12h05
  5. Réponses: 3
    Dernier message: 07/06/2006, 13h11

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