Các lớp lồng nhau tĩnh - 1

"Vì vậy, chủ đề số hai là các lớp lồng nhau tĩnh. Hãy nhớ rằng các lớp lồng nhau không tĩnh được gọi là các lớp bên trong .

"Chúng ta hãy tìm hiểu xem từ tĩnh có nghĩa là gì trong ngữ cảnh của một khai báo lớp lồng nhau. Bạn nghĩ sao?"

"Nếu một biến được khai báo là tĩnh, thì chỉ có một bản sao của biến đó tồn tại. Vì vậy, nếu một lớp lồng nhau là tĩnh, thì điều đó có nghĩa là bạn chỉ có thể tạo một đối tượng của lớp đó?"

"Đừng để từ tĩnh làm bạn bối rối ở đây. Đúng là nếu một biến được khai báo là tĩnh, thì chỉ có một bản sao của biến đó. Nhưng một lớp lồng tĩnh giống một phương thức tĩnh hơn về mặt này. từ tĩnh trước khi khai báo lớp chỉ ra rằng lớp không lưu trữ các tham chiếu đến các đối tượng của lớp bên ngoài của nó."

"À. Các phương thức bình thường lưu trữ ngầm một tham chiếu đối tượng, nhưng các phương thức tĩnh thì không. Lớp tĩnh cũng vậy, đúng không, Ellie?"

"Chắc chắn rồi. Sự hiểu biết nhanh chóng của bạn thật đáng khen ngợi. Các lớp lồng nhau tĩnh không có các tham chiếu ẩn đến các đối tượng của lớp bên ngoài của chúng."

class Zoo
{
 private static int count = 7;
 private int mouseCount = 1;

 public static int getAnimalCount()
 {
  return count;
 }

 public int getMouseCount()
 {
  return mouseCount;
 }

 public static class Mouse
 {
  public Mouse()
  {
  }
   public int getTotalCount()
  {
   return count + mouseCount; // Compilation error.
  }
 }
}

"Hãy xem lại ví dụ này một cách cẩn thận."

"Phương thức getAnimalCount tĩnh có thể truy cập những biến nào?"

"Chỉ những cái tĩnh. Bởi vì nó là một phương thức tĩnh."

"Phương thức getMouseCount có thể truy cập những biến nào?"

"Cả cái tĩnh và cái không tĩnh. Nó có một tham chiếu ẩn (cái này) tới một đối tượng Zoo."

"Đúng vậy. Vì vậy, lớp Mouse lồng tĩnh, giống như một phương thức tĩnh, có thể truy cập các biến tĩnh của lớp Zoo, nhưng nó không thể truy cập các biến không tĩnh."

"Chúng tôi có thể tạo các đối tượng Mouse một cách an toàn, ngay cả khi không có một đối tượng Zoo nào được tạo. Đây là cách bạn có thể làm điều đó:"

class Home
{
 public static void main(String[] args)
 {
  Zoo.Mouse mouse = new Zoo.Mouse();
 }
}

"Lớp Mouse thực sự là một lớp rất bình thường. Việc nó được khai báo bên trong lớp Zoo mang lại cho nó hai tính năng đặc biệt."

1) Khi tạo các đối tượng của một lớp lồng nhau (chẳng hạn như lớp Mouse) bên ngoài lớp bên ngoài, bạn cũng phải sử dụng toán tử dấu chấm để chỉ định tên của lớp bên ngoài.

"Ví dụ như thế này: Zoo.Mouse."

2) Lớp Zoo.Mouse và các đối tượng của nó có quyền truy cập vào các biến và phương thức tĩnh riêng của lớp Zoo (vì lớp Mouse cũng được khai báo bên trong lớp Zoo).

"Điều này là dành cho hôm nay."

"Vậy chỉ là một cái tên bổ sung và thế thôi sao?"

"Đúng."

"Điều đó thậm chí còn dễ dàng hơn so với lúc đầu."