非静态变量,不能从静态上下文引用

时间:2013-01-03 09:34:09

标签: java-me lcdui

我正在使用java me。我试图从First.java中的另一个displayble(form1)中的okCommand切换到Second.java中的可显示(form2)(请参阅我的previous question)。

我收到了错误non-static method getForm2() cannot be referenced from a static context。我必须在它可以工作之前在second.java中添加单词static到form2声明以及getForm2方法。

现在问题是form2中的backCommand无法切换回First.java中的form1,它会弹出错误non-static variable this cannot be referenced from a static context

我暂停并花了一些时间来刷新自己关于如何使用static关键字的语言基础知识,并且我知道静态方法是类方法而非静态方法是实例方法而非非-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 个答案:

答案 0 :(得分:2)

您有static方法,但正在使用this。但是this并不存在。它通常会引用该类的实例,但你在这里没有。

如果您的方法不是static并且您实例化了此类的实例,那么这将有效。

e.g。

Second s = new Second();
Form f = s.getForm2(); // if this method wasn't static

将该方法设为静态仅仅意味着命名空间。没有关联的实例,也没有this

答案 1 :(得分:2)

有几种选择。首先是创建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"
    }
    //...

从您描述的问题来看,我更喜欢另一种选择 - 返回到previous question中的设计并使用Second的实例作为通过First的构造函数传递的参数。

你的First.java会有如下行:

 //...
 private final Second second; // instance needed for commandAction
 //...
 First(Second second) { // constructor with parameter
    this.second = second; // save the parameter
    //...
 }

然后,First.java中的commandAction方法可以使用如下代码:

switchDisplayable(null, second.getSecondForm());
// instead of Second.getSecondForm()