O que realmente acontece (ou seja, o que o compilador gera a partir das classes) - 1

"Oi, amigo! Aqui estão mais algumas informações para você."

"Eu já disse a você que o compilador na verdade converte todas as classes anônimas em classes internas comuns."

"Sim. Eu até me lembro que seus nomes são números: 1, 2, 3, etc."

"Exatamente. Mas há outra nuance aqui."

"Se uma classe for declarada dentro de um método e usar qualquer uma de suas variáveis, as referências a essas variáveis ​​serão adicionadas à classe gerada. Veja você mesmo."

"Começamos com isso:"

Antes de compilar:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
 final int number = i;
   result.add(new Car()
    {
     public String toString()
     {
      return ""+number;
     }
    });
  }
  return result;
 }
}

"E o compilador gera isso:

Depois de compilar:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
   final int number = i;
   result.add(new Anonymous2 (number));
  }
   return result;
  }

 class Anonymous2
 {
  final int number;
  Anonymous2(int number)
 {
  this.number = number;
 }

  public String toString()
  {
   return ""+ number;
  }
 }
}

"Você entendeu? A classe interna não pode alterar a variável local do método, porque no momento em que o código da classe interna é executado, podemos estar saindo do método completamente."

"Agora o segundo ponto. O método toString() usa uma variável passada. Para isso, foi necessário:"

A) salve-o dentro da classe gerada

B) adicioná-lo ao construtor.

"Entendi. Classes declaradas dentro de métodos sempre usam cópias de variáveis."

"Exatamente!"

"Então faz sentido por que as variáveis ​​devem ser finais. E por que elas não podem ser alteradas. Se você estiver realmente trabalhando com cópias em vez dos originais, o usuário não entenderá por que ele não pode alterar os valores das variáveis, que significa que precisamos apenas proibi-lo de alterá-los."

"Certo, declarar variáveis ​​como finais parece um pequeno preço a pagar em troca de fazer com que o compilador gere uma classe para você, passe-a para o método e salve todas as variáveis ​​do método que você deseja usar."

"Eu concordo. Aulas locais anônimas ainda são super legais."

"Se eu declarar uma classe local dentro de um método e usar as variáveis ​​do método nele, o compilador as adicionará à classe também?"

"Sim, ele irá adicioná-los à classe e seu construtor."

"Isso foi o que eu pensei."