Java me 非静态变量不能从静态上下文引用此变量

Java me 非静态变量不能从静态上下文引用此变量,java-me,lcdui,Java Me,Lcdui,我正在和java我一起工作。我试图在Second.java中从First.java中的另一个displayble(form1)中的okCommand切换到displaybable(form2)(请参见我的说明) 我遇到一个错误无法从静态上下文引用非静态方法getForm2()。我必须在form2声明中添加static这个词,并且在Second.java中的getForm2方法中添加static这个词,然后它才能工作 现在的问题是form2中的backCommand无法切换回First.java中

我正在和java我一起工作。我试图在Second.java中从First.java中的另一个displayble(form1)中的okCommand切换到displaybable(form2)(请参见我的说明)

我遇到一个错误
无法从静态上下文引用非静态方法getForm2()。我必须在form2声明中添加static这个词,并且在Second.java中的getForm2方法中添加static这个词,然后它才能工作

现在的问题是form2中的backCommand无法切换回First.java中的form1,它会弹出错误
非静态变量,该变量不能从静态上下文引用

我停顿了一下,花了一些时间更新了关于如何使用static关键字的语言基础知识,我了解到静态方法是类方法,非静态方法是实例方法,非静态方法不能调用静态方法,除非创建了非静态方法的实例,并且创建了静态方法无法调用非静态方法

我真的不理解我应该理解的实现,我希望使用上面的示例进行一些澄清

下面是Second.java的源代码错误来自
form2.setCommandListener(this)


您有一个
静态
方法,但正在使用
。但是,
这个
并不存在。它通常会引用类的一个实例,但这里没有

如果您的方法不是静态的,并且您实例化了这个类的一个实例,那么这就行了

e、 g


使该方法保持静态只意味着名称空间。没有关联的实例,也没有

存在耦合选项。第一个是创建第二个的静态实例,并在
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
    //...
 }
然后,First.java中的
commandAction
方法可以使用如下代码:

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

如果出现此错误-“无法从静态上下文引用非静态方法getForm2()”,可以粘贴到实际尝试调用“getForm2”的代码中吗?下面是代码。但是我通过在Second.java public void commandAction(Command命令,displaybable displaybable){if(displaybable==form1){if(Command==exitCommand){exitMIDlet();}else if(Command==okCommand)中的声明和getForm2方法中添加static关键字来修复了这个问题{switchDisplayable(null,Second.getForm2());}}}}First选项不起作用。它说构造函数Second不能应用于给定的类型。找不到任何参数。第二个选项也不起作用。它说“变量Second可能尚未初始化”,并在commandAction上说我上一个问题中的“找不到变量实例”。我已经按照指示完成了操作,可以在Second.java中切换到form2。我现在要做的是在form2中添加一个backCommand,将用户首先带回到form1。java@KenWaribo对于第一个选项,您需要将正确的参数传递给第二个的构造函数(它没有显示在您的代码片段中)。至于第二个选项,我的代码中有一个输入错误对不起-使用第二个选项更正了,在包含First.java构造函数public First()的行上{}我仍然得到错误“变量second可能没有初始化这是我经过多次尝试和错误后现在所做的。我在First.java second s=new second(this)中添加了这一行;然后在我的命令操作中添加了:switchDisplayable(null,s.getSecondForm());一旦它再次起作用,我可以再次选择Ok命令并被带到Second.java中的secondForm。这次我没有使secondForm像最初建议的那样是静态的。请进一步细分,以便我可以真正得到您的建议
 //...
 private final Second second; // instance needed for commandAction
 //...
 First(Second second) { // constructor with parameter
    this.second = second; // save the parameter
    //...
 }
switchDisplayable(null, second.getSecondForm());
// instead of Second.getSecondForm()