Чтобы ответить на ваш первый вопрос:
final ByteArrayOutputStream out = new ByteArrayOutputStream() {
@Override
public void close() throws IOException {
open.remove(path);
super.close();
}
};
Здесь вы создаете подкласс ByteArrayOutputStream на лету, то есть анонимно. Вот почему у вас есть другой файл .class.
Чтобы ответить на ваш второй вопрос:
Вы можете загружать только родительские внутренние классы, видимые для подкласса, через объект экземпляра суперкласса:
Superclass s = new Superclass();
Superclass.Subclass sub = s.new Subclass();
Если внутренний класс является статическим, то есть вложенный класс верхнего уровня (поскольку не существует такого понятия, как внутренний статический класс), может быть создан следующим образом:
Superclass.Subclass s = new Superclass.Subclass();
и для него не требуется экземпляр объекта суперкласса.
Надеюсь, это поможет!