2

私はjavameを使用しています。First.javaの別のdisplayble(form1)のokCommandからSecond.javaのdisplayable(form2)に切り替えようとしました(これに関する以前の質問を参照してください)。

エラーが発生しましnon-static method getForm2() cannot be referenced from a static contextた。動作する前に、form2宣言とSecond.javaのgetForm2メソッドにstaticという単語を追加する必要がありました。

ここでの問題は、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

いくつかのオプションがあります。1つは、の静的インスタンスを作成し、それを: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 に答える