Ne peut pas faire une référence statique à la méthode non statique

construire une application multilingue en Java. Obtenir une erreur lors de l'insertion de la valeur de la chaîne de caractères de R.string fichier de ressources XML:

public static final String TTT =  (String) getText(R.string.TTT);

C'est le message d'erreur:

erreur: ne peut pas faire une référence statique à la méthode non-statique getText (int) du type Contexte

comment cela est-il causé et comment puis-je le résoudre?

88
demandé sur BalusC 2011-02-11 15:49:13

8 réponses

puisque getText() est non-statique, vous ne pouvez pas l'appeler d'une méthode statique.

Pour comprendre pourquoi, vous devez comprendre la différence entre les deux.

Instance méthodes (non-statiques) travail sur les objets qui sont d'un type particulier (la classe). Ceux-ci sont créés avec les nouveaux comme ceci:

SomeClass myObject = new SomeClass();

pour appeler une méthode d'instance, vous l'appelez sur l'instance ( myObject ):

myObject.getText(...)

cependant une méthode statique/champ peut être appelé seulement sur le type directement, dire comme ceci: la déclaration précédente n'est pas correcte. on peut également se référer à des champs statiques avec une référence d'objet comme myObject.staticMethod() mais cela est découragé parce qu'il ne dit pas clairement qu'ils sont des variables de classe.

... = SomeClass.final

et les deux ne peuvent pas fonctionner ensemble car ils opèrent sur différents espaces de données (données d'instance et données de classe)

laissez-moi essayer de vous expliquer. Considérons cette classe (psuedocode):

class Test {
     string somedata = "99";
     string getText() { return somedata; } 
     static string TTT = "0";
}

maintenant j'ai le cas d'utilisation suivant:

Test item1 = new Test();
 item1.somedata = "200";

 Test item2 = new Test();

 Test.TTT = "1";

Quelles sont les valeurs?

puits

in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99

En d'autres termes, TTT est une donnée qui est partagée par toutes les instances de ce type. Donc ça ne fait pas sens de dire

class Test {
         string somedata = "99";
         string getText() { return somedata; } 
  static string TTT = getText(); // error there is is no somedata at this point 
}

alors la question est pourquoi TTT statique ou pourquoi getText() n'est pas statique?

Supprimer static et il devrait sortir de cette erreur, mais sans comprendre ce que votre type n'est qu'un sparadrap jusqu'à la prochaine erreur. Quelles sont les exigences de getText() qui exigent qu'il soit non statique?

129
répondu Preet Sangha 2016-07-20 22:33:53

il y a déjà de bonnes réponses avec des explications sur la raison pour laquelle le mélange de la méthode non-statique Context 151930920" ne peut pas être utilisé avec votre static final String .

Une bonne question à se poser est: pourquoi voulez-vous faire cela? Vous tentez de charger un String à partir de votre ressource strings et d'en remplir la valeur dans un champ public static . Je suppose que c'est pour que certains de vos autres cours puissent y accéder? Si oui, il n'y a pas besoin de le faire ce. Passez plutôt un Context dans vos autres classes et appelez context.getText(R.string.TTT) de l'intérieur.

public class NonActivity {

    public static void doStuff(Context context) {
        String TTT = context.getText(R.string.TTT);
        ...
    }
}

et pour appeler cela de votre Activity :

NonActivity.doStuff(this);

cela vous permettra d'accéder à votre ressource String sans avoir à utiliser un champ public static .

10
répondu dave.c 2014-06-05 09:37:43

, pour d'autres qui le trouver dans la recherche:

j'obtiens souvent celui-ci quand j'appelle accidentellement une fonction en utilisant le nom de classe plutôt que le nom d'objet. Cela se produit typiquement parce que je leur donne des noms trop semblables : p

c'est à dire:

MyClass myclass = new MyClass();

// then later

MyClass.someFunction();

C'est évidemment une méthode statique. (bon pour somethings) Mais ce que je voulais vraiment faire (dans la plupart des cas)

myclass.someFunction();

c'est tellement bête erreur, mais tous les deux mois, je gaspille environ 30 minutes à jouer avec vars dans les définitions de "MyClass" pour comprendre ce que je fais de mal quand vraiment, c'est juste une faute de frappe.

Funny note: stack overflow souligne la syntaxe pour rendre l'erreur vraiment évidente ici.

7
répondu SpiRail 2011-12-18 14:56:12

vous pouvez soit rendre votre variable non statique

public final String TTT =  (String) getText(R.string.TTT);

ou faire statique la méthode " getText "(si possible)

2
répondu Kellindil 2011-02-11 12:54:49

getText est un membre de votre activité donc il doit être appelé quand" ceci " existe. Votre variable statique est initialisée lorsque votre classe est chargée avant que votre activité ne soit créée.

puisque vous voulez que la variable soit initialisée à partir d'une chaîne de ressources, alors elle ne peut pas être statique. Si vous voulez qu'il soit statique, vous pouvez l'initialiser avec la valeur de la Chaîne.

2
répondu Robby Pond 2011-02-11 13:00:07

vous ne pouvez pas faire référence à la variable statique de la méthode non statique. Pour comprendre cela , vous devez comprendre la différence entre statiques et non statiques.

les variables statiques sont des variables de classe , elles appartiennent à la classe avec leur seule instance , créée à la première seulement. Les variables Non statiques sont initialisées chaque fois que vous créez un objet de la classe.

maintenant à votre question, lorsque vous utilisez new () operator nous allons créez une copie de chaque Non-statique déposée pour chaque objet, mais ce n'est pas le cas pour les champs statiques. C'est pourquoi il donne erreur de compilation si vous faites référence à une variable statique non méthode statique.

1
répondu Krishna 2015-12-19 16:30:24

cette question n'est pas nouvelle et les réponses existantes donnent une bonne base théorique. Je voudrais juste ajouter une réponse plus pragmatique.

getText est une méthode de la classe de résumé de contexte et pour l'appeler, il faut une instance de sa sous-classe (activité, Service, Application ou autre). Le problème est que les variables finales statiques publiques sont initialisées avant qu'une instance de contexte ne soit créée.

Il y a plusieurs façons de résolvez ceci:

  1. faire de la variable une variable membre (champ) de L'activité ou de l'Autre Sous-classe de contexte en supprimant le modificateur statique et en le plaçant dans le corps de classe;
  2. le garder statique et retarder l'initialisation à un point ultérieur (par exemple dans la méthode onCreate);
  3. en font une variable locale à la place de l'usage effectif.
0
répondu dev.bmax 2015-12-20 12:39:34

vous ne pouvez pas utiliser une méthode non statique pour initialiser une variable statique.

-1
répondu frm 2011-02-11 12:52:02