"Chào, Amigo!"

"Chào, Ellie!"

"Hôm nay chúng ta có một chủ đề rất thú vị. Hôm nay tôi sẽ nói với các bạn về các lớp lồng nhau."

"Nếu một lớp được khai báo bên trong một lớp khác, thì đó là một lớp lồng nhau. Các lớp lồng nhau không tĩnh được gọi là các lớp bên trong."

"Các đối tượng của lớp bên trong được lồng bên trong các đối tượng của lớp bên ngoài và do đó có thể truy cập các biến của lớp bên ngoài."

Ví dụ
public class Car
{
 int height = 160;
 ArrayList doors = new ArrayList();

 public Car
 {
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
 }

class Door()
 {
  public int getDoorHeight()
  {
   return (int)(height * 0.80);
  }
 }
}

"Lưu ý rằng lớp Door có phương thức getDoorHeight. Nó sử dụng biến chiều cao của đối tượng Xe hơi và trả về chiều cao của cửa."

Các lớp lồng nhau - 1

"Một đối tượng Door không thể tồn tại độc lập với một đối tượng Car. Xét cho cùng, nó sử dụng các biến của đối tượng Car. Trình biên dịch vô hình thêm vào hàm tạo và lớp Door một tham chiếu đến đối tượng Car bên ngoài, do đó các phương thức của lớp Door bên trong có thể truy cập các biến của lớp Car bên ngoài và gọi các phương thức của nó."

"Các đối tượng lồng nhau. Tôi thấy hợp lý. Dựa vào sơ đồ, tất cả đều khá đơn giản."

"Và đúng như vậy. Ngoại trừ một vài sắc thái."

"Lớp Door bên trong có một tham chiếu đến đối tượng Car, do đó:"

1) Bạn không thể tạo một đối tượng Door bên trong một phương thức tĩnh của lớp Car, bởi vì các phương thức tĩnh không chứa tham chiếu đến đối tượng Car được chuyển hoàn toàn cho hàm tạo Door.

Chính xác Không đúng
public class Car
{
 public static Door createDoor()
 {
  Car car = new Car();
  return car.new Door();
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{
 public static Door createDoor()
 {
  return new Door();
 }

 public class Door
 {
  int width, height;
 }
}

2) Lớp Door không thể chứa các biến hoặc phương thức tĩnh.

Chính xác Không đúng
public class Car
{
 public int count;
 public int getCount()
 {
  return count;
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{

 public class Door
 {
  public static int count;
  int width, height;

  public static int getCount()
  {
   return count;
  }
 }
}

"Và nếu tôi cần một biến được chia sẻ bởi tất cả các đối tượng Cửa thì sao?"

"Bạn luôn có thể chỉ cần khai báo nó trong lớp Xe hơi. Sau đó, nó sẽ được chia sẻ bởi tất cả các đối tượng Cửa được lồng trong một đối tượng Xe hơi."

3) Lưu ý: nếu lớp bên trong được khai báo là công khai, thì các thể hiện của nó có thể được tạo bên ngoài lớp ngoài, nhưng một thể hiện của lớp ngoài phải tồn tại trước:

Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().newDoor();

4) Còn một comment nữa mà suýt quên mất.

"Vì chúng ta có hai đối tượng lồng nhau, nên các phương thức của đối tượng bên trong có quyền truy cập vào hai tham chiếu được gọi là 'cái này':"

public class Car
{
 int width, height;

 public class Door
 {
  int width, height;

  public void setHeight(int height)
  {
   this.height = height;
  }

 public int getHeight()
 {
  if (height != 0)
   return this.height;
  else
   return (int)(Car.this.height * 0.8);
 }
}

"Tôi đã cố tình khai báo các biến có cùng tên trong các lớp."

"Để truy cập một biến từ lớp bên ngoài khi nó bị ẩn hoặc để truy cập 'cái này' bên trong lớp bên trong, chỉ cần viết 'YourClassName.this':"

Cách truy cập 'cái này' của lớp bên ngoài (hoặc bất kỳ lớp nào khác)
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"Vì vậy, nếu chúng ta viết 'this' bên trong phương thức của lớp bên trong, thì 'this' đề cập đến lớp bên trong?"

"Đúng chính xác."

"Bạn nghĩ gì về các lớp học bên trong, Amigo?"

"Chúng rất thú vị. Tôi không nói chúng quá khó."

"Có rất nhiều hạn chế, nhưng chúng có vẻ khá hợp lý sau khi bạn giải thích những hạn chế đó đến từ đâu và tại sao chúng tồn tại."

"Thêm vào đó, tôi đã viết các lớp lồng nhau trong các nhiệm vụ trong hai tháng, nhưng chỉ đến bây giờ tôi mới nhận ra những gì tôi thực sự đã viết."

"Cảm ơn vì bài học tuyệt vời, Ellie."

"Tôi rất vui vì bạn thích nó, Amigo."