Не может сделать статическую ссылку на нестатический метод
создание многоязычного приложения на Java. Получение ошибки при вставке строкового значения из R.string XML-файл ресурса:
public static final String TTT = (String) getText(R.string.TTT);
это сообщение об ошибке:
ошибка: не удается сделать статическую ссылку на нестатический метод getText (int) из типа
Контекст
Как это вызвано и как я могу решить это?
8 ответов:
С
getText()является нестатическим вы не можете вызвать его из статического метода.чтобы понять, почему, вы должны понять разницу между ними.
методы экземпляра (нестатические) работают с объектами определенного типа (класса). Они создаются с новым, как это:
SomeClass myObject = new SomeClass();чтобы вызвать метод экземпляра, вы вызываете его на экземпляре (
myObject):myObject.getText(...)статический метод/поле может быть называется только на типе непосредственно, скажем так: предыдущее утверждение неверно. можно также ссылаться на статические поля со ссылкой на объект, например
myObject.staticMethod()но это не рекомендуется, потому что это не было ясно, что они являются переменными класса.... = SomeClass.finalи они не могут работать вместе, поскольку они работают на разных пространствах данных (данные экземпляра и данные класса)
позвольте мне попытаться объяснить. Рассмотрим этот класс (psuedocode):
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 }Итак, вопрос в том, почему это ТТТ static или почему getText () не статичен?
удалить
staticи это должно пройти мимо этой ошибки-но без понимания того, что делает ваш тип, это всего лишь лейкопластырь до следующей ошибки. Каковы требованияgetText()которые требуют, чтобы он был нестатическим?
есть несколько хороших ответов уже с объяснениями, почему смесь нестатических
ContextметодgetText()не может быть использован сstatic final String.хороший вопрос: почему вы хотите это сделать? Вы пытаетесь загрузить
Stringиз своегоstringsресурс, и заполнить его значение в
для других, которые находят это в поиске:
Я часто получаю это, когда я случайно вызвать функцию, используя имя класса, а не имя объекта. Обычно это происходит потому, что я даю им слишком похожие имена : Р
ie:
MyClass myclass = new MyClass(); // then later MyClass.someFunction();это, очевидно, статический метод. (хорошо для чего-то) Но что я действительно хотел сделать (в большинстве случаев)
myclass.someFunction();Это такая глупая ошибка, но каждые пару месяцев, я трачу примерно 30 mins возится с vars в определениях "MyClass", чтобы выяснить, что я делаю неправильно, когда на самом деле это просто опечатка.
смешное Примечание: переполнение стека подчеркивает синтаксис, чтобы сделать ошибку действительно очевидной здесь.
вы можете либо сделать переменную не статический!--2-->
public final String TTT = (String) getText(R.string.TTT);или сделать метод" getText " статическим (если это вообще возможно)
getText является членом вашей деятельности, поэтому он должен быть вызван, когда "это" существует. Статическая переменная инициализируется при загрузке класса перед созданием действия.
Так как вы хотите, чтобы переменная была инициализирована из строки ресурса, то она не может быть статической. Если вы хотите, чтобы он был статическим, вы можете инициализировать его строковым значением.
вы не можете сделать ссылку на статическую переменную из нестатического метода. Чтобы понять это , нужно понять разницу между статическим и нестатическим.
статические переменные являются переменными класса,они принадлежат классу с их единственным экземпляром , созданным только в первом. Нестатические переменные инициализируются каждый раз при создании объекта класса.
теперь перейдем к вашему вопросу, когда вы используете новый оператор () мы создадим копию каждого нестатический файл для каждого объекта, но это не относится к статическим полям. Вот почему он дает ошибку времени компиляции, если вы ссылаетесь на статическую переменную из нестатического метода.
этот вопрос не является новым и существующим ответы дают хорошие теоретические знания. Я просто хочу добавить более прагматичный ответ.
getText-это метод абстрактного класса контекста, и для его вызова требуется экземпляр его подкласса (Activity, Service, Application или другой). Проблема заключается в том, что открытые статические конечные переменные инициализируются до создания любого экземпляра контекста.
есть несколько способов решить эту проблему:
- сделайте переменную переменной-членом (полем) действия или другого подкласса контекста, удалив статический модификатор и поместив его в тело класса;
- держите его статическим и задержите инициализацию до более поздней точки (например, в методе onCreate);
- сделать его локальной переменной в месте фактического использования.
Comments