Нестатическая переменная, на которую нельзя ссылаться из статического контекста
Я работаю с Java. Я попытался переключиться на отображаемый (form2) в Second.java из okCommand в другом displayble(form1) в First.java (см. Мой предыдущий вопрос по этому вопросу).
Я получил ошибку non-static method getForm2() cannot be referenced from a static context
, Мне пришлось добавить слово static в объявление form2, а также в метод getForm2 в Second.java, чтобы оно могло работать.
Теперь проблема в том, что backCommand в form2 не может переключиться обратно в form1 в First.java, и появляется ошибка non-static variable this cannot be referenced from a static context
,
Я сделал паузу и занял некоторое время, чтобы освежить в себе основы языка о том, как используется ключевое слово static, и я узнал, что статический метод - это метод класса, а нестатический метод - это метод экземпляра и что нестатический не может вызывать статический метод, если не создан экземпляр нестатического метода, а также что статический метод не может вызывать нестатический метод.
Я действительно не понимаю реализацию, как я должен, и я был бы признателен за разъяснения, используя мой пример выше.
Вот источник ниже от Second.java, ошибка исходит от form2.setCommandListener(this);
public static Form getForm2() {
if (form2 == null) {
form2 = new Form("form");
form2.addCommand(getBackCommand());
form2.setCommandListener(this);
}
return form2;
2 ответа
У тебя есть static
метод, но используете this
, Но this
не существует Обычно он ссылается на экземпляр класса, но здесь его нет.
Если ваш метод не был static
и вы создали экземпляр этого класса, тогда это будет работать.
например
Second s = new Second();
Form f = s.getForm2(); // if this method wasn't static
Создание статического метода означает немного больше, чем пространство имен. Нет связанного экземпляра и нет this
,
Есть пара вариантов. Во-первых, это создать статический экземпляр Second
и использовать его в getForm2
:
//...
// static instance
private static Second instance = new Second(/* put constructor arguments here, if any */);
//...
public static Form getForm2() {
if (form2 == null) {
form2 = new Form("form");
form2.addCommand(getBackCommand());
form2.setCommandListener(instance); // --> replace "this" with "instance"
}
//...
Из проблем, которые вы описываете, я бы предпочел другой вариант - вернуться к дизайну, который вы имели в предыдущем вопросе, и использовать экземпляр Second
в качестве аргумента, передаваемого через конструктор First
,
Ваш First.java будет иметь такие строки:
//...
private final Second second; // instance needed for commandAction
//...
First(Second second) { // constructor with parameter
this.second = second; // save the parameter
//...
}
Затем, commandAction
Метод в First.java может использовать такой код:
switchDisplayable(null, second.getSecondForm());
// instead of Second.getSecondForm()