0

私はJavaSwingを初めて使用しますが、プライベートクラスを使用するのはこれが初めてです。

私は次のコードを試しています-

ActionListener listener = new AddButtonListener();

ここで、AddButtonListenerは、ActionListenerインターフェイスを実装するプライベートクラスです。

private class AddButtonListener implements ActionListener{
  public void actionPerformed(ActionEvent e){
  ....
  }
}

ただし、次のような日食エラーが発生します

タイプsomeTypeの囲んでいるインスタンスにはアクセスできません。タイプsomeTypeの囲んでいるインスタンス(egxnew A()、xはsomeTypeのインスタンス)で割り当てを修飾する必要があります。

クラスはsomeType内の静的mainメソッドでインスタンス化されていることに注意してください。

このエラーが発生するのはなぜですか?mainメソッドが静的だからですか?

4

3 に答える 3

5

AddButtonListenerは内部クラスであり、静的ではないため、外部クラスのオブジェクトを使用してのみインスタンス化できます。

たとえば、AddButtonListenerクラスがSomeTypeで定義されている場合、

SomeType obj = new SomeType();

SomeType.AddButtonListener listener = obj.new AddButtonListener();

SomeTypeのメソッドを使用している場合は、この非静的内部クラスのオブジェクトを次のように作成します。

AddButtonListener listener = this.new AddButtonListener();

SomeType(囲み型)のインスタンスを使用せずにAddButtonListenerのインスタンスを作成する場合は、AddButtonListenerを静的クラスとしてマークする必要があります。

private static class AddButtonListener implementsActionListener{
    public void actionPerformed(ActionEvent e){
        ....
    }
}

つまり、クラスがプライベートであるということではなく、静的ではないということです。

于 2012-10-21T03:45:24.447 に答える
2

例外メッセージはほとんどすべてを説明しています。

プライベートクラスをインスタンス化するには、その囲み型のインスタンスが存在する必要があります。プライベートクラスは囲んでいるタイプのインスタンスのメンバーにアクセスできるので、そのようなインスタンスが存在しない場合、プライベートクラスのインスタンスはどこで囲んでいるタイプのメンバーにアクセスできますか?

質問に戻ります。

他のインスタンスを作成せずにインスタンスを作成する場合。AddButtonListenerとして宣言することはできますprivate static classが、これにより、クラスAddButtonListenerのメンバーにアクセスできなくなります。SomeType

または、次のような構文を使用する必要があります。

SomeType t = new SomeType();
AddButtonListener listener = t.new AddButtonListener();

ただし、詳細コードを提供していないため、どちらの方法が正しいかを判断できません。私の経験では、それを囲むクラスでプライベートクラスを使用する場合、このような問題は発生しないはずです。mainメソッドなどでテストしようとしている場合を除きます。

于 2012-10-21T03:55:45.423 に答える
2

Vikdorは正しいです。ただし、このような場合(リスナーは1回だけ使用されます)、通常は匿名クラスを使用します。

...
ActionListener listener = new ActionListener(){

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub          
    }       

};
...

ここでは、必要なインターフェイスまたはクラスを拡張することにより、メソッド内でクラスondeを定義します。

于 2012-10-21T03:59:32.417 に答える