いいえ、できません。また、コンパイラはそれを理解できません。これが、FindBugsが暗黙の参照static
を使用しない場合、匿名の内部クラスを名前付きのネストされたクラスに変更することを常に提案する理由です。this
編集: Tom Hawtin-タックラインは、匿名クラスが静的コンテキスト(main
メソッドなど)で作成された場合、匿名クラスは実際にはであると述べていstatic
ます。しかし、JLSは同意しません:
匿名クラスは決してありませんabstract
(§8.1.1.1)。匿名クラスは常に内部クラスです(§8.1.3)。それは決してありませんstatic
(§8.1.1、§8.5.1)。匿名クラスは常に暗黙的にfinal
行われます(§8.1.1.2)。
Roedy GreenのJava用語集によると、静的コンテキストで匿名クラスが許可されるという事実は、実装に依存します。
あなたがあなたのコードを維持している人々を困惑させたいのなら、言語仕様が匿名クラスは決してそうではないと言っているとしても、wagsはinitコードとメソッドjavac.exe
内で匿名クラスを許可することを発見しました。もちろん、これらの匿名クラスは、オブジェクトのインスタンスフィールドにアクセスできません。これを行うことはお勧めしません。この機能はいつでもプルできます。static
static
static
編集2: JLSは実際には§15.9.2でより明示的に静的コンテキストをカバーしています:
Cをインスタンス化されるクラスとし、iを作成されるインスタンスとします。Cが内部クラスである場合、私はすぐに囲むインスタンスを持っている可能性があります。iのすぐに囲まれたインスタンス(§8.1.3)は次のように決定されます。
- Cが匿名クラスの場合、次のようになります
。
- クラスインスタンス作成式が静的コンテキスト(§8.1.3)で発生する場合、iにはすぐにインスタンスを囲むことはありません。
- それ以外の場合、 iのすぐに囲むインスタンスはです
this
。
static
したがって、静的コンテキストの匿名クラスは、技術的にはクラスではありませんが、それを囲むクラスへの参照を保持しないという点で、ネストされたクラスとほぼ同等static
です。