Problème de procédure static en java

Fermé
aurelie689 - 29 oct. 2008 à 14:23
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 - 29 oct. 2008 à 16:27
Bonjour,
je suis en train de créer un programme utilisnt les notions de classe et de sous-classe en code jaa ( c'est mon niveau actuel j'ai commencé en septembre).
Je travaille sur netbean et lors de l'éxecution on me signale une erreur lorsque je fais appel à une procédure que j'ai codé dans le fichier main :
"non static method (ma procédure==>) reserver(p_camping.C_mobilhom[],java.lang.Boolean,java.lang.Boolean,int , int, int, java.lang.String.int cannot be referenced from a static context)
je ne sais aps trop comment interpréter cette phrase...
Merci de votre éventuelle aide
A voir également:

10 réponses

kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 14:38
Salut,

Prenons un exemple:
class Maison
{
    static String qui = "je suis une maison"
    private String couleur;
    
    public Maison(String couleur)
    {
        this.couleur = couleur;
    }

    public void deQuelleCouleur()
    {
        System.out.println(couleur);
    }

    public static void quiSuisJe(void)
    {
        System.out.prinln(qui);
    }
}


Une fois que tu as ça, dans ton main tu peux faire:
Maison.quiSuisJe();

Ca marchera très bien, il va t'afficher qu'il est une maison car cette méthode est statique: elle ne dépend d'aucune instance de Maison, elle appartient à la classe, donc tu peux l'appeller directement.

Maintenant essaie de faire
Maison.deQuelleCouleur()

Ben là tu vas te faire jeter. Tu n'es pas dans un contexte d'instance, tu es dans un contexte de classe.

Une analogie: On ne demande pas aux plans d'une maison de quelle couleur seront ses rideaux. Par contre une fois qu'on a construit une maison à partir de ce plan, on peut avoir des rideaux de la couleur qu'on veut.

La classe c'est les plans de la maison, l'instance c'est une maison construite à partir de ce plan.

Or toi dans ton code, tu as essayé de faire ça:
class Maison
{
    static String qui = "je suis une maison"
    private String couleur;
    
    public Maison(String couleur)
    {
        this.couleur = couleur;
    }

    public void deQuelleCouleur()
    {
        System.out.println(couleur);
    }

    public static void quiSuisJe(void)
    {
        System.out.prinln(qui);
        this.deQuelleCouleur();
    }
}

Essaie de demander aux plan d'une maison de quelle couleur sont ses rideaux. L'architecte va te répondre: "bah euh ca dépend mon bon monsieur (ou ma bonne mamzelle), on peut faire des milliers de maisons différentes à partir de ce plan. Les gens y mettront les rideaux qu'ils veulent, je ne peux pas répondre à votre question....
Par contre je peux vous répondre en ce qui concerne les choses qui seront communes à toutes ces maisons: les fondations etc...
1
Mais quel est le lien avec mon problème car cette procédure est codée dans le programme principal? Il ne s'agit pas de classe là...?
En ttou merci pour tes explications très détaillées :)
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 14:53
Tu ne veux pas faire un copier-coller de ton code ici?
Met le entre balises <code> <code>
Et dis moi quelle est la ligne incriminée.
0
ça me dérange un peu car il y a beaucoup de classes et je ne sais pa si tu arriverais à comprendre le sprocédures sans savoir ce que contiennent les classes :s
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 15:07
Cette méthode est dans ta classe principale et tu l'appelles depuis le main?
Le main est static. Donc si ta méthode n'est pas statique...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ah ok.. J'ai compris! J'ai mis static mais maitenant j'ai une erreur pour chaque argument de la procédure...il faut que j'initialise toutes mes variables avant d'utiliser la procédure? même si je les ai déclarées cela ne suffit pas pour s'en servir?
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 15:19
Euh mais je ne sais pas ce que fais ta procédure, ni dans quel contexte...alors bon... sans code c'est quasiment impossible.
0
Oui je comprend, enfin ma question est si on uilise une procédure il faut forcément déclarer les arguments dans la classe ou est implémentée la procédure mais est - ce vraiment utile de donner une valeur aux argument sachant que c'est le but de la procédure?
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 15:35
Si tu ne les utilise que dans ta procédure ben non ya pas besoin.
0
Pourtant j'ai du le sinitialiser pour que ma procédure fonctionne...maintenant elle marche mais une autre procédure à laquelle elle fait appel ne marche pas... ah les joies du débugage!! en tout cas merci beaucoup d'avoir passé du temps pour me répondre!
0
En fait j'ai un autre pb :s je ne sais pas qi c'est particulier au langage java ( j'ai fait du pascal avant ) mais si j'ai par exemple la procedure

public void verif_semaine(int num_semaine_deb, Boolean rep){
Scanner sc = new Scanner (System.in);
System.out.println("Entrez le numero de semaine");
num_semaine_deb=sc.nextInt();
if(tab_dispo[num_semaine_deb]==0){
rep=true;
}
else {
rep=false;
}

}

Si j'entre 1 pour le numéro de la semaine et que je sors de la procédure alors num_semaine_deb reste à 0 la valeur initiale, comment faire pour que la valeur donnée lors de la procédure soit gardée en mémoire?
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 16:07
Comme ça:
public int verif_semaine(Boolean rep){ 
int num_semaine_deb;
Scanner sc = new Scanner (System.in); 
System.out.println("Entrez le numero de semaine"); 
num_semaine_deb=sc.nextInt(); 
if(tab_dispo[num_semaine_deb]==0){ 
rep=true; 
} 
else { 
rep=false; 
} 
return num_semaine_deb;

}

Tu récupères sa valeur de retour.
0
ok merci, mais comment je fais pour récupérer la valeur de mon booléen? le return fonctionne aussi? a c emoment là je en comprend pas l'intéret de faire uneproédure... enfin si mais ça alourdit le programme quand on veut la valeur de tout les arguments apres l'execution d ela procédure..
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 16:21
Euh....j'ai pas trouvé mieux que ça, c'est pas très propre mais bon... :-s
public Object[] verif_semaine(){ 
Integer num_semaine_deb;
Object[] ret = new Object[2];
Scanner sc = new Scanner (System.in); 
System.out.println("Entrez le numero de semaine"); 
num_semaine_deb=sc.nextInt(); 
if(tab_dispo[num_semaine_deb]==0){ 
    ret[1] = new Boolean(true);
} 
else { 
    ret[1] = new Boolean(false);
} 
ret[0] = num_semaine_deb;
return ret;
}


Et plus tard tu récupères comme ça:
Object[] val = verif_semaine();
Integer i = (Integer) val[0];
Boolean b = (Boolean) val[1];


:-s
0
tu utilises un tableau pour retourner la valeur du booléen?
0
kilian Messages postés 8732 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 5 février 2025 1 526
29 oct. 2008 à 16:27
Pour retourner l'entier et le booléen. Comme ils ne sont pas du même type, je les ai mis dans un tableau ayant le type d'un de leurs ancêtres communs: Object.
0