2013-01-03 91 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

相關問題