Apa yang sebenarnya berlaku (iaitu apa yang dihasilkan oleh pengkompil daripada kelas) - 1

"Hai, Amigo! Ini maklumat lanjut untuk awak."

"Saya sudah memberitahu anda bahawa pengkompil sebenarnya menukar semua kelas tanpa nama kepada kelas dalaman biasa."

"Ya. Saya pun ingat nama mereka adalah nombor: 1, 2, 3, dll."

"Betul. Tetapi ada satu lagi nuansa di sini."

"Jika kelas diisytiharkan di dalam kaedah dan menggunakan mana-mana pembolehubahnya, maka rujukan kepada pembolehubah tersebut akan ditambahkan pada kelas yang dijana. Lihat sendiri."

"Kita mulakan dengan ini:"

Sebelum menyusun:
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;
 }
}

"Dan pengkompil menjana ini:

Selepas menyusun:
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;
  }
 }
}

"Adakah anda faham maksudnya? Kelas dalam tidak boleh menukar pembolehubah tempatan kaedah, kerana pada masa kod kelas dalam dilaksanakan, kita mungkin akan keluar dari kaedah sama sekali."

"Sekarang titik kedua. Kaedah toString() menggunakan pembolehubah yang diluluskan. Untuk mencapai ini, adalah perlu untuk:"

A) simpannya di dalam kelas yang dihasilkan

B) tambahkannya pada pembina.

"Faham. Kelas yang diisytiharkan dalam kaedah sentiasa menggunakan salinan pembolehubah."

"Tepat sekali!"

"Maka masuk akal mengapa pembolehubah mesti muktamad. Dan mengapa pembolehubah itu tidak boleh diubah. Jika anda sebenarnya bekerja dengan salinan dan bukannya yang asal, pengguna tidak akan faham mengapa dia tidak boleh menukar nilai pembolehubah, yang bermakna kita hanya perlu melarangnya daripada mengubahnya."

"Betul, mengisytiharkan pembolehubah sebagai muktamad nampaknya harga yang kecil untuk dibayar sebagai pertukaran kerana pengkompil menjana kelas untuk anda, hantarkannya kepada kaedah dan simpan semua pembolehubah kaedah yang anda mahu gunakan."

"Saya setuju. Kelas tempatan tanpa nama masih hebat."

"Jika saya mengisytiharkan kelas tempatan di dalam kaedah, dan saya menggunakan pembolehubah kaedah di dalamnya, adakah pengkompil akan menambahkannya ke kelas juga?"

"Ya, ia akan menambahkannya pada kelas dan pembinanya."

"Itulah apa yang saya fikir."