Нестатическая переменная, на которую нельзя ссылаться из статического контекста

Я работаю с 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()
Другие вопросы по тегам