Java: non-static method cannot be referenced from a static context [Résolu]

Signaler
-
 Ritius -
Bonjour! Dans l'une de mes classes, j'essaie d'appeler une méthode qui vient d'une autre classe. Donc j'ai fait:
AutreClasse.methode();

Sauf que quand je fais ça, j'ai l'erreur suivante: "non-static method cannot be referenced from a static context"

elle est déclarée en premier lieu dans une interface, de la manière suivante:
public static Type methode();

et elle est également implémentée (et complétée) de la même manière dans AutreClasse
Donc je vois pas d'où vient le problème, étant donné que je l'ai déclaré partout en static? :(

Si quelqu'un a la réponse, je lui en serai gré :)

3 réponses

Messages postés
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 739
Bonjour,

Que ce soit dans une classe ou dans une interface il n'est jamais possible de déclarer une méthode static sans code comme ton
public static Type methode();
  • Soit dans ton interface tu as une méthode static (donc avec du code) et dans ce cas il faut l'appeler de manière static avec le nom de l'interface.
    public interface Interface {
        static String methode(){
            return "Hello World!";
        }
    }
    Interface.methode();
  • Soit dans ton interface tu as juste une méthode déclarée, sans code (donc non static) et dans ce cas il faut l'appeler depuis un objet qui implémente cette interface.
    public interface Interface {
        String methode();
    }
    public class Classe implements Interface {
        @Override
        public String methode(){
            return "Hello World!";
        }
    }
    Classe objet = new Classe();
    objet.methode();
D'accord, je vois, merci pour ta réponse.

Par contre, si j'essaie de faire:
objet.getMethode();

dans une classe autre que celle où j'ai déclaré mon getteur, j'ai une erreur de type <identifier> expected ou bien "cannot resolve symbol 'getMethode'

J'ai essayé de mettre mon getter en statique, ou d'instancier un autre objet, mais ça n'a rien changé.
Messages postés
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 739
Est-ce que tu as déclaré la méthode comme étant public ?

Remarque : sans ton code je ne peux que faire des hypothèses, je peux tomber juste où être complètement à côté de la plaque, donc pour éviter de tourner autour du pot il serait préférable que tu copies ton code sur le forum pour savoir exactement de quoi tu parles...
>
Messages postés
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020

D'accord, merci à toi de prendre le temps de me répondre. Alors voilà mon code.

Ce que j'aimerais faire, c'est aller dans la classe DecreaseGrayLevel, et utiliser la variable grayLevel (contenue dans la classe ByteGrayColor). J'imagine que je dois utiliser son accesseur getGrayLevel() pour récupérer sa valeur, mais je n'y arrive pas, et donc je suis bloquée à cette étape-là.

import java.awt.Color;

/**
 * Classe ByteGrayColor: Pour manipuler le coleur d'un pixel en niveau de gris (grey level).
 */

public class ByteGrayColor implements GrayColor {

    private static final int MINIMUM_GRAY_LEVEL = 0;
    private static final int MAXIMUM_GRAY_LEVEL = 255;
    private static final int OPACITY = 1;

    public static final ByteGrayColor WHITE = new ByteGrayColor(MAXIMUM_GRAY_LEVEL);
    public static final ByteGrayColor BLACK = new ByteGrayColor(MINIMUM_GRAY_LEVEL);

    // entier compris entre 0 (noir) et 255 (blanc)
    private static int grayLevel;

    // accesseur
    public ByteGrayColor(){
       this.grayLevel = MINIMUM_GRAY_LEVEL;
    }

    // constructeur
    public ByteGrayColor(int grayLevel) {
        this.grayLevel = grayLevel;
    }

    // constructeur du grayLevel via un double
    public ByteGrayColor(double luminosity) {
        double conversionLum = luminosity*256;
        int conversionLumInt = (int)Math.round(conversionLum);
        this.grayLevel = conversionLumInt;
    }


    // accesseur
    public double getGrayLevel(){
     return grayLevel;
    }




    // accesseur retournant la luminosité de la couleur (entre 0 noir et 1 blanc)
    public double getLuminosity(){
        double grayLevelDouble = new Double(grayLevel);
        double lumosity = grayLevelDouble/256;
        return lumosity;
    }


    /////////////////////////////////////////////////////////////////////
    public GrayColor invert(){
        return new ByteGrayColor(MAXIMUM_GRAY_LEVEL-this.grayLevel);
    }


    @Override
    public Color getColor(){
        float component = (float)getLuminosity();
        return new Color(component, component, component);
    }


    //comparaison du niveau de gris général à celui de l'objet o
    public int compareTo(GrayColor o) {
        int oGrayLevel = (int) o.getGrayLevel();
        return this.grayLevel-oGrayLevel;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (this.getClass() != o.getClass()) return false;
        ByteGrayColor color = (ByteGrayColor) o;
        return this.compareTo(color) == 0;
    }

}


public class DecreaseGrayLevels implements Transform{


    int nbGrayLevels;


    ByteGrayColor grayLevelImport = new ByteGrayColor(1);
    
    // --> erreur ici <--
    // Cannot resolve symbol 'getGrayLevel'
    grayLevelImport.getGrayLevel();


    @Override
    public void applyTo(GrayImage image) {

    

    }


}


/** 
Interface for transformations to Image
**/

public interface Transform {
    void applyTo(GrayImage image);
}
Messages postés
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 739 > Ritius
Le problème c'est que tu ne peux pas faire d'appels comme ça si ton code n'est pas dans une méthode.

Mais sinon ça fonctionne :
public class DecreaseGrayLevels implements Transform {

    int nbGrayLevels;

    private void toto(){
        ByteGrayColor grayLevelImport = new ByteGrayColor(1);
        grayLevelImport.getGrayLevel();
    }

    @Override
    public void applyTo(GrayImage image) {
    }
}
>
Messages postés
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020

Mais non, j'arrive pas à y croire ! Ca fait des jours que je bloque là dessus, et il suffisait que je le mette dans une méthode!!! Je ne sais pas pourquoi d'ailleurs, étant donné que je n'ai pas beaucoup de connaissances en java...

Un grand merci à toi!!!
Par contre maintenant j'aimerais stocker (toujours dans ma classe DecreaseGrayLevel)

image.getPixelGrayColor(i, j);


dans une variable de type double, mais j'ai l'erreur suivante:
incompatible types. Found: 'GrayColor', required: 'double'


y aurait-il un moyen de bien stocker la valeur de image.getPixelGrayColor(i, j); dans un double ?
Messages postés
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020
2 739
Je ne sais pas d'où vient ta méthode getPixelGrayColor mais si je comprends un peu l'idée tu dois pouvoir faire :
GrayColor grayColor = image.getPixelGrayColor(i, j);
double grayLevel = grayColor.getGrayLevel();
>
Messages postés
16121
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
30 novembre 2020

effectivement, ça marche tout aussi bien!! Merci encore !!!