Điều gì thực sự xảy ra (tức là những gì trình biên dịch tạo ra từ các lớp) - 1

"Chào, Amigo! Đây là một số thông tin thêm cho bạn."

"Tôi đã nói với bạn rằng trình biên dịch thực sự chuyển đổi tất cả các lớp ẩn danh thành các lớp bên trong bình thường."

"Yep. Tôi thậm chí còn nhớ rằng tên của họ là những con số: 1, 2, 3, v.v."

"Chính xác. Nhưng có một sắc thái khác ở đây."

"Nếu một lớp được khai báo bên trong một phương thức và sử dụng bất kỳ biến nào của nó, thì các tham chiếu đến các biến đó sẽ được thêm vào lớp đã tạo. Hãy tự mình xem."

"Chúng ta bắt đầu với điều này:"

Trước khi biên dịch:
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;
 }
}

"Và trình biên dịch tạo ra điều này:

Sau khi biên dịch:
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;
  }
 }
}

"Bạn đã hiểu chưa? Lớp bên trong không thể thay đổi biến cục bộ của phương thức, bởi vì vào thời điểm mã của lớp bên trong được thực thi, chúng ta có thể thoát khỏi phương thức hoàn toàn."

"Bây giờ là điểm thứ hai. Phương thức toString() sử dụng một biến đã truyền. Để thực hiện điều này, cần phải:"

A) lưu nó bên trong lớp đã tạo

B) thêm nó vào hàm tạo.

"Hiểu rồi. Các lớp được khai báo bên trong các phương thức luôn sử dụng bản sao của các biến."

"Chính xác!"

"Sau đó, có lý do tại sao các biến phải là cuối cùng. Và tại sao chúng không thể thay đổi được. Nếu bạn thực sự đang làm việc với các bản sao thay vì bản gốc, người dùng sẽ không hiểu tại sao anh ta không thể thay đổi giá trị của các biến, điều này có nghĩa là chúng ta chỉ cần cấm anh ta thay đổi chúng."

"Đúng vậy, việc khai báo các biến là cuối cùng có vẻ là một cái giá nhỏ phải trả để đổi lấy việc trình biên dịch tạo một lớp cho bạn, chuyển nó cho phương thức và lưu tất cả các biến của phương thức mà bạn muốn sử dụng."

"Tôi đồng ý. Các lớp học địa phương ẩn danh vẫn rất tuyệt."

"Nếu tôi khai báo một lớp cục bộ bên trong một phương thức và tôi sử dụng các biến của phương thức trong đó, thì trình biên dịch có thêm chúng vào lớp không?"

"Có, nó sẽ thêm chúng vào lớp và hàm tạo của nó."

"Đó là những gì tôi nghĩ."