web-dev-qa-db-fra.com

Erreur "La méthode non statique ne peut pas être référencée à partir d'un contexte statique"

J'ai une classe nommée Media qui a une méthode nommée setLoanItem:

public void setLoanItem(String loan) {
    this.onloan = loan;
}

J'essaie d'appeler cette méthode à partir d'une classe nommée GUI de la manière suivante:

public void loanItem() {
    Media.setLoanItem("Yes");
}

Mais je reçois l'erreur

la méthode non statique setLoanItem (Java.lang.String) ne peut pas être référencée à partir d'un contexte statique.

J'essaie simplement de changer la variable onloan dans la classe Media en "Oui" à partir de la classe GUI.

J'ai regardé d'autres sujets avec le même message d'erreur mais rien ne se fait en cliquant!

67
Daniel Mckay

Les méthodes d'instance doivent être appelées à partir d'une instance. Votre méthode setLoanItem est une méthode d'instance (elle n'a pas le modificateur static), ce dont elle a besoin pour fonctionner (car elle définit une valeur sur l'instance à laquelle elle est appelée ( this)).

Vous devez créer une instance de la classe avant de pouvoir appeler la méthode dessus:

Media media = new Media();
media.setLoanItem("Yes");

(Btw, il serait préférable d'utiliser un booléen au lieu d'une chaîne contenant "Oui".)

72
Nathan Hughes

setLoanItem est une méthode d'instance, ce qui signifie que vous avez besoin d'une instance de la classe Media pour l'appeler. Vous essayez de l'appeler sur le type de média lui-même.

Vous voudrez peut-être examiner certains tutoriels de base orientés objet pour voir comment fonctionnent les membres statiques/d'instance.

11
Joe Enos

setLoanItem() n'est pas une méthode statique, c'est une méthode d'instance, ce qui signifie qu'elle appartient à une instance particulière de cette classe plutôt qu'à cette classe elle-même.

Essentiellement, vous n'avez pas spécifié d'objet multimédia quoi sur lequel vous souhaitez appeler la méthode, vous avez uniquement spécifié le nom de la classe. Il peut y avoir des milliers d’objets multimédias et le compilateur n’a aucun moyen de savoir de quoi vous parlez. Il en résulte une erreur.

Vous souhaiterez probablement passer un objet multimédia sur lequel appeler la méthode:

public void loanItem(Media m) {
    m.setLoanItem("Yes");
}
2
Michael Berry

Vous devez séparer correctement les données statiques des données d'instance. Dans votre code, onLoan et setLoanItem() sont des membres d'instance. Si vous souhaitez les référencer/les appeler, vous devez le faire via une instance. Donc soit vous voulez

public void loanItem() {
    this.media.setLoanItem("Yes");
}

ou

public void loanItem(Media object) {
    object.setLoanItem("Yes");
}

en fonction de la manière dont vous souhaitez transmettre cette instance.

0
OrangeDog