2

匿名クラスが記述されたコンテキスト (静的または非静的メソッド) に依存することはわかっています。しかし、コードのこの部分を見てください:

public class A {
    int fieldOfA;

    private static class B {
        int fieldOfB;
    }

    public static void main(String[] args) {

        B obj = new B() { //this anonymous class is static becuase is in the main method.

            private static void testMethod() { //so why here i have an error and i can put just a non-static method
                                               //if my class is static ?
                                               //a class static can have static method, but this class no, why?
            }
        };
    }
}

匿名クラスが静的であることは確かですか?

4

2 に答える 2

5

コンテキストが静的である場合、匿名クラスは静的です。たとえば、静的メソッドで。

非静的コンテキストが存在する場合、非静的にする必要があるかどうかに関係なく、匿名クラスは非静的です。非静的コンテキストが使用されていない場合、コンパイラはクラスを静的にするほど賢くありません。

この例では、2 つの匿名クラスが作成されました。静的メソッドの 1 つは外部クラスへの参照を持たず、静的なネストされたクラスのようなものです。

注: これらのクラスは引き続き「内部」と呼ばれ、外部クラスへの参照がなくても静的メンバーを持つことはできません。

import java.util.Arrays;

public class Main {
    Object o = new Object() {
        {
            Object m = Main.this; // o has a reference to an outer class.
        }
    };

    static Object O = new Object() {
        // no reference to Main.this;
        // doesn't compile if you use Math.this
    };

    public void nonStaticMethod() {
        Object o = new Object() {
            {
                Object m = Main.this; // o has a reference to an outer class.
            }
        };
        printFields("Anonymous class in nonStaticMethod", o);
    }

    public static void staticMethod() {
        Object o = new Object() {
            // no reference to Main.this;
            // doesn't compile if you use Math.this
        };
        printFields("Anonymous class in staticMethod", o);
    }

    private static void printFields(String s, Object o) {
        System.out.println(s + " has fields " + Arrays.toString(o.getClass().getDeclaredFields()));
    }

    public static void main(String... ignored) {
        printFields("Non static field ", new Main().o);
        printFields("static field ", Main.O);
        new Main().nonStaticMethod();
        Main.staticMethod();
    }
}

版画

Non static field  has fields [final Main Main$1.this$0]
static field  has fields []
Anonymous class in nonStaticMethod has fields [final Main Main$3.this$0]
Anonymous class in staticMethod has fields []
于 2013-12-12T21:47:32.483 に答える
2

JLS 15.9.5から:

匿名クラスは常に内部クラスです (§8.1.3)。決して静的ではありません (§8.1.1、§8.5.1)。

セクション8.1.3では、静的コンテキストで発生する場合を含め、内部クラスについて詳しく説明します。ただし、それら自体は決して静的ではないため、静的メンバー (定数変数以外) を宣言することはできません。

于 2013-12-12T21:53:38.047 に答える