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?
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?
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
.
, 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.
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)
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.
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.
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:
- 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;
- le garder statique et retarder l'initialisation à un point ultérieur (par exemple dans la méthode onCreate);
- en font une variable locale à la place de l'usage effectif.
vous ne pouvez pas utiliser une méthode non statique pour initialiser une variable statique.