2013-01-03 90 views
1

我正在使用java我。我尝试在First.java中的另一个displayble(form1)中的okCommand中切换到Second.java中的可显示表单(form2)(请参阅我的previous question)。非静态变量不能从静态上下文中引用

我得到了一个错误non-static method getForm2() cannot be referenced from a static context。我必须在form2声明中添加static这个词,并且在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; 
+0

如果您收到此错误 - “非静态方法getForm2()不能从静态上下文中引用“ - 你可以粘贴实际上试图调用”getForm2“的代码吗? – djhayman

+0

这是代码。但我通过在声明中添加static关键字和在Second中添加getForm2方法来解决此问题。的java 公共无效的commandAction(命令命令,可显示可显示){ 是否(可显示== Form1中){ IF(命令== exitCommand){ exitMIDlet(); else if(command == okCommand){ switchDisplayable(null,Second.getForm2()); } } } – degee

回答

2

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

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

例如

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

使该方法静态意味着比命名空间更多。没有关联的实例,也没有this

+0

请进一步分解这个,所以我可以真正让你请 – degee

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() 
+0

谢谢谢谢你谢谢你! – degee

+0

第一个选项不起作用。它说构造函数Second不能应用于给定的类型。没有发现任何争论 第二个选项也没有工作。它说“变量秒可能没有被初始化”,并在commandAction上,它说“无法找到变量实例” – degee

+0

从我以前的问题。我按照指示完成了,可以在Second.java中切换到form2。我现在想要做的是在form2中添加一个backCommand,将用户带回到First.java中的form1 – degee

相关问题