Dürfen Klassen innerhalb einer Methode implementiert werden?

Ja, das geht.

Verwendung findet das beispielsweise bei der Implementierung von abstrakten Klassen oder Interfaces in Methoden.

Im folgenden Beispiel wird in der Methode foo() die abstrakte Klasse Thread implementiert.

static void foo() {
    class A extends Thread {
        @Override
        public void run() {
            //
        }
    }
    Thread o = new A();
    o.start();
}

public static void main(String[] args) {
    foo();
}

Rein syntaktisch ist es auch möglich, eigene Klassen innerhalb einer Methode zu implementieren. Der Einsatz solcher Klassen ist freilich nur eingeschränkt möglich, weil auf die Methoden und Attribute außerhalb der Methode, in der die Klasse implementiert ist, nicht zugegriffen werden kann. Eine mögliche Anwendung wäre die Umsetzung einer mathematischen Funktion, die nur innerhalb einer Methode sichtbar ist.

Im nachfolgenden Codebeispiel wird die sinc-Funktion in der Klasse MyInnerClass der Methode printTable() implementiert.

static void printTable() {
    class MyInnerClass {
        double sinc(double x) {
            if (x != 0) {
                return Math.sin(x) / x;
            } else {
                return 1;
            }
        }
    }

    MyInnerClass o = new MyInnerClass();
    for (double x = 0; x < 2.0; x += 0.1) {
        double y = o.sinc(x);
        System.out.println(x + " " + y);
    }
}

public static void main(String[] args) {
    printTable();
}