Это называется локальным классом.
2 - это просто: да, файл класса будет сгенерирован.
1 и 3 - это один и тот же вопрос. Вы бы использовали локальный класс, в котором вам никогда не нужно создавать экземпляр или знать о деталях реализации где-либо, кроме одного метода.
Типичным использованием было бы создание одноразовой реализации некоторого интерфейса. Например, вы часто видите что-то вроде этого:
//within some method
taskExecutor.execute( new Runnable() {
public void run() {
classWithMethodToFire.doSomething( parameter );
}
});
Если вам нужно создать кучу таких и что-то с ними сделать, вы можете изменить это на
//within some method
class myFirstRunnableClass implements Runnable {
public void run() {
classWithMethodToFire.doSomething( parameter );
}
}
class mySecondRunnableClass implements Runnable {
public void run() {
classWithMethodToFire.doSomethingElse( parameter );
}
}
taskExecutor.execute(new myFirstRunnableClass());
taskExecutor.execute(new mySecondRunnableClass());
Относительно интерфейсов: я не уверен, есть ли техническая проблема, которая делает локально определенные интерфейсы проблемой для компилятора, но даже если нет, они не добавят никакой ценности. Если бы локальный класс, который реализует локальный интерфейс, использовался вне метода, интерфейс был бы бессмысленным. И если локальный класс будет использоваться только внутри метода, и интерфейс, и класс будут реализованы в этом методе, поэтому определение интерфейса будет избыточным.