2

我正在和 java 我一起工作。我试图从 First.java 中另一个 displayble(form1) 中的 okCommand 切换到 Second.java 中的 displayable(form2)(请参阅我之前的问题)。

我有一个错误non-static method getForm2() cannot be referenced from a static context。我必须在 form2 声明以及 Second.java 中的 getForm2 方法中添加静态一词,然后它才能工作。

现在的问题是 form2 中的 backCommand 无法切换回 First.java 中的 form1 并弹出错误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;
4

2 回答 2

3

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

如果您的方法不是static并且您实例化了此类的一个实例,那么这将起作用。

例如

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

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

于 2013-01-03T09:37:52.583 回答
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"
    }
    //...

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

您的 First.java 将具有如下行:

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

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

switchDisplayable(null, second.getSecondForm());
// instead of Second.getSecondForm()
于 2013-01-03T10:23:08.950 回答