我正在使用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;
答案 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()