Вопрос-ответ

Cannot make a static reference to the non-static method

Не удается создать статическую ссылку на нестатический метод

Создание многоязычного приложения на Java. Выдача ошибки при вставке строкового значения из R.string ресурсного XML-файла:

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

Это сообщение об ошибке:


Ошибка: Не удается создать статическую ссылку на нестатический метод getText(int) из контекста типа


Чем это вызвано и как я могу это решить?

Переведено автоматически
Ответ 1

Поскольку getText() является нестатическим, вы не можете вызвать его из статического метода.

Чтобы понять почему, вы должны понимать разницу между ними.

Методы экземпляра (нестатические) работают с объектами определенного типа (класса). Они создаются с помощью new следующим образом:

SomeClass myObject = new SomeClass();

Чтобы вызвать метод экземпляра, вы вызываете его в экземпляре (myObject):

myObject.getText(...)

Однако статический метод / поле можно вызвать только для типа напрямую, скажем так:
Предыдущее утверждение неверно. Можно также ссылаться на статические поля с помощью ссылки на объект типа myObject.staticMethod() но это не рекомендуется, потому что это не дает понять, что они являются переменными класса.

... = SomeClass.final

И эти два метода не могут работать вместе, поскольку они работают с разными пространствами данных (данными экземпляра и данными класса)

Позвольте мне попытаться объяснить. Рассмотрим этот класс (псевдокод):

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

Теперь у меня есть следующий вариант использования:

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

Test item2 = new Test();

Test.TTT = "1";

Каковы значения?

Хорошо

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

Другими словами, TTT это элемент данных, который является общим для всех экземпляров типа. Поэтому нет смысла говорить

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

Итак, вопрос в том, почему TTT является статическим или почему getText() не является статическим?

Удалите static и эта ошибка должна быть устранена - но без понимания того, что делает ваш тип, это всего лишь пластырь до следующей ошибки. Каковы требования getText(), которые требуют, чтобы он был нестатическим?

Ответ 2

Уже есть несколько хороших ответов с объяснениями, почему сочетание нестатического Context метода getText() не может быть использовано с вашим static final String.

Хороший вопрос, который следует задать: зачем вы хотите это сделать? Вы пытаетесь загрузить String из своего strings ресурса и заполнить его значение в public static поле. Я предполагаю, что это для того, чтобы некоторые другие ваши классы могли получить к нему доступ? Если да, то в этом нет необходимости. Вместо этого передайте Context в другие ваши классы и вызывайте context.getText(R.string.TTT) изнутри них.

public class NonActivity {

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

И вызвать это из вашего Activity:

NonActivity.doStuff(this);

Это позволит вам получить доступ к вашему String ресурсу без необходимости использования public static поля.

Ответ 3

для других, которые находят это в поиске:

Я часто получаю эту ссылку, когда случайно вызываю функцию, используя имя класса, а не имя объекта. Обычно это происходит потому, что я даю им слишком похожие имена : P

ie:

MyClass myclass = new MyClass();

// then later

MyClass.someFunction();

Очевидно, что это статический метод. (хорош для чего-то)
Но то, что я действительно хотел сделать (в большинстве случаев было)

myclass.someFunction();

Это такая глупая ошибка, но каждые пару месяцев я трачу около 30 минут, возясь с переменными в определениях "MyClass", чтобы понять, что я делаю не так, когда на самом деле это просто опечатка.

Забавное примечание: stack overflow выделяет синтаксис, чтобы ошибка здесь была действительно очевидной.

Ответ 4

Вы можете либо сделать свою переменную нестатической

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

или сделайте метод "getText" статическим (если это вообще возможно)

java