Sto studiando le classi anonime e in tutta sincerità ho capito poco.
Sul manuale c'è un esempio che dovrebbe permettere di comprendere bene il funzionamento delle classi anonime.
L'esempio è il seguente:
codice:
public class Film {
    private String nome;
    private String genere;
    private int mediaRecensioni;

    public Film (String nome, String genere, int mediaRecensioni) {
        this.nome = nome;
        this.genere = genere;
        this.mediaRecensioni = mediaRecensioni;
    }

    // metodi set e get omessi
     
    public String toString(){
        return getNome();
    }
}
codice:
public class Videoteca {
    private Film[] films;

    public Videoteca () {
        films = new Film[10];
        caricaFilms();
    }
    public void setFilms(Film[] films) {
        this.films = films;
    }

    public Film[] getFilms() {
        return films;
    }

    public Film[] getFilmDiFantascienza() {
        Film [] filmDiFantascienza = new Film[10];
        for (int i = 0, j= 0; i< 10;i++) {
            if ("Fantascienza".equals(films[i].getGenere())) {
                filmDiFantascienza[j] = films[i];
                j++;
            }
        }
        return filmDiFantascienza;
    }

    public Film[] getBeiFilm() {
        Film [] beiFilms = new Film[10];
        for (int i = 0, j= 0; i< 10;i++) {
            if (films[i].getMediaRecensioni() >3) {
                beiFilms[j] = films[i];
                j++;
            }
        }
        return beiFilms;
    }

    private void caricaFilms() {
        
    // caricamento film 

    }
}
codice:
public class TestVideoteca {
    public static void main(String args[]) {
        Videoteca videoteca = new Videoteca();
        
    System.out.println("\nFilm di Fantascienza:");
        Film[] filmDiFantascienza = videoteca.getFilmDiFantascienza();
    for(Film film : filmDiFantascienza)
        {
        if(film != null)
        {
            System.out.println(film);
        }    
    }

    // omesso test bei film
}
A Questo punto il manuale dice che la soluzione migliore consiste nell'utilizzo delle classi anonime:

codice:
public interface FiltroFilm
{
    boolean filtra(Film film);
}
codice:
public class Videoteca {
    private Film[] films;

    public Videoteca () {
        films = new Film[10];
        caricaFilms();
    }
    public void setFilms(Film[] films) {
        this.films = films;
    }

    public Film[] getFilms() {
        return films;
    }

    public Film[] getFilmFiltrati(FiltroFilm filtroFilm) {
        Film [] filmFiltrati = new Film[10];
        for (int i = 0, j= 0; i< 10;i++) {
            if (filtroFilm.filtra(films[i])) {
                filmFiltrati[j] = films[i];
                j++;
            }
        }
        return filmFiltrati;
    }        

    private void caricaFilms() {
        
    // caricamento film 

    }
}
codice:
public class TestVideoteca {
    public static void main(String args[]) {
          Videoteca videoteca = new Videoteca();
       
      System.out.println("\nFilm di Fantascienza:");
          Film[] filmDiFantascienza = videoteca.getFilmFiltrati(new FiltroFilm() {
                public boolean filtra(Film film) {
                return"Fantascienza".equals(film.getGenere());
              }
          } );
          stampaFilm(filmDiFantascienza);      
   

          System.out.println("Bei Film:");
          Film[] beiFilms =   videoteca.getFilmFiltrati(new FiltroFilm() {
                public boolean filtra(Film film) {
                return film.getMediaRecensioni() >3;
                }
          } );
      stampaFilm(beiFilms);
    
       
      private static void stampaFilm(Film [] films) {
          for (Film film: films) {
                if (film != null) {
                        System.out.println(film);
                }
          }
           
}

Io di questo esempio ho capito ben poco, cioè ho capito l'utilizzo delle classi anonime ma non riesco a comprendere questo specifico caso.
Mi potete aiutare nella comprensione?