Was wirklich passiert (d. h. was der Compiler aus Klassen generiert) - 1

„Hallo, Amigo! Hier sind noch ein paar Informationen für dich.“

„Ich habe Ihnen bereits gesagt, dass der Compiler tatsächlich alle anonymen Klassen in gewöhnliche innere Klassen umwandelt.“

„Ja. Ich erinnere mich sogar daran, dass ihre Namen Zahlen sind: 1, 2, 3 usw.“

„Genau. Aber hier gibt es noch eine weitere Nuance.“

„Wenn eine Klasse innerhalb einer Methode deklariert wird und eine ihrer Variablen verwendet, werden Verweise auf diese Variablen zur generierten Klasse hinzugefügt. Überzeugen Sie sich selbst.“

„Wir beginnen damit:“

Vor dem Kompilieren:
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;
 }
}

„Und der Compiler generiert Folgendes:

Nach dem Kompilieren:
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;
  }
 }
}

„Haben Sie verstanden, worum es geht? Die innere Klasse kann die lokale Variable der Methode nicht ändern, denn wenn der Code der inneren Klasse ausgeführt wird, beenden wir die Methode möglicherweise ganz.“

„Jetzt der zweite Punkt. Die toString()-Methode verwendet eine übergebene Variable. Um dies zu erreichen, war Folgendes erforderlich:“

A) Speichern Sie es in der generierten Klasse

B) Fügen Sie es dem Konstruktor hinzu.

„Verstanden. In Methoden deklarierte Klassen verwenden immer Kopien von Variablen.“

"Exakt!"

„Dann macht es Sinn, warum Variablen endgültig sein müssen. Und warum sie nicht geändert werden können. Wenn Sie tatsächlich mit Kopien und nicht mit den Originalen arbeiten, wird der Benutzer nicht verstehen, warum er die Werte der Variablen nicht ändern kann Das heißt, wir müssen ihm einfach verbieten, sie zu ändern.“

„Richtig, die Deklaration von Variablen als endgültig scheint ein geringer Preis dafür zu sein, dass der Compiler eine Klasse für Sie generiert, sie an die Methode übergibt und alle Variablen der Methode speichert, die Sie verwenden möchten.“

„Ich stimme zu. Anonyme lokale Kurse sind immer noch super cool.“

„Wenn ich eine lokale Klasse innerhalb einer Methode deklariere und darin die Variablen der Methode verwende, fügt der Compiler sie dann auch der Klasse hinzu?“

„Ja, sie werden der Klasse und ihrem Konstruktor hinzugefügt.“

"Das ist was ich dachte."