114 votes

Ne peut pas Faire Référence Statique Non Méthode Statique

La construction d'un multi-langue de l'application en Java. D'avoir une erreur lors de l'insertion de la Chaîne de valeur de R.string de la ressource de fichier XML:

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

C'est le message d'erreur:

Erreur: Impossible de faire une référence statique pour les non-statique méthode getText(int) du type Contexte

Merci à l'avance.

155voto

Preet Sangha Points 39414

Depuis getText est non-statique, vous ne pouvez pas appeler à partir d'une méthode statique.

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

Exemple (non statique) méthodes de travail sur des objets d'un type particulier (la classe). Ceux-ci sont créés avec la nouvelle comme ceci:

SomeClass myObject = new SomeClass();

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

myObject.getText(...)

Cependant une méthode statique/champ peut être appelée uniquement sur le type directement, disons le comme ceci: La précédente déclaration n'est pas correcte. On peut également se référer à des champs statiques avec un objet de référence comme myObject.staticMethod() mais cela est déconseillé, car il ne précise pas qu'ils sont des variables de classe.

... = SomeClass.final

Et les deux ne peuvent pas travailler ensemble, car ils fonctionnent sur différents espaces de données (données d'instance et de classe de données)

Permettez-moi de tenter de l'expliquer. Considérez cette classe (psuedocode):

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

Maintenant, j'ai la suite de cas d'utilisation:

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

 Test item2 = new Test();

 Test.TTT = "1";

Quelles sont les valeurs?

Bien

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 il n'ont pas de sens à dire

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

Donc la question est: pourquoi est - TTT statique ou pourquoi est-getText() et non statique?

Supprimer la statique 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 nécessitent d'être non statique?

12voto

dave.c Points 9120

Il y a quelques bonnes réponses déjà avec des explications de pourquoi le mélange de la non-statique Context méthode getText() ne peut pas être utilisé avec votre static final String.

Une bonne question à se poser est: pourquoi voulez-vous faire cela? Vous essayez de charger un String de votre strings des ressources, et de remplir sa valeur en public static champ. Je suppose que c'est ainsi que certains de vos autres classes peuvent y avoir accès? Si oui, il n'est pas nécessaire pour ce faire. Au lieu de passer un Context dans les autres cours et l'appel en 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 cela appeler à partir de votre Activity:

NonActivity.doStuff(this);

Cela vous permettra d'accéder à votre String des ressources sans avoir à utiliser un public static champ.

10voto

SpiRail Points 362

pour les autres qui le trouver dans la recherche:

Je reçois souvent cela lorsque j'ai accidentellement appeler une fonction en utilisant le nom de la classe plutôt que le nom de l'objet. Cela se produit généralement parce que je leur donne aussi des noms similaires : 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 une bête erreur, mais tous les deux mois, je perds environ 30 minutes de jouer avec les revendeurs dans le "MyClass" définitions de travailler sur ce que je fais mal quand vraiment, c'est juste une faute de frappe.

Drôle de remarque: débordement de pile met en évidence la syntaxe de faire l'erreur vraiment évident ici.

2voto

Kellindil Points 2962

Vous pouvez soit faire votre variable non statique

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

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

2voto

Robby Pond Points 37875

getText est un membre de votre Activité, de sorte qu'il doit être appelée lorsque "cela" existe. Votre statique de la variable est initialisée lors de votre classe est chargée en avant votre Activité est créée.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X