JavaRush /Blog Java /Random-VI /Các lớp lồng nhau tĩnh

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

Xuất bản trong nhóm
Xin chào! Chúng ta tiếp tục khám phá chủ đề về các lớp lồng nhau trong Java. Trong bài học trước chúng ta đã nói về các lớp lồng nhau không tĩnh hoặc, chúng còn được gọi là các lớp bên trong. Các lớp lồng nhau tĩnh - 2Hôm nay chúng ta hãy chuyển sang một nhóm khác và xem xét kỹ hơn về các lớp lồng nhau tĩnh. Các lớp lồng nhau tĩnh - 3Họ khác với các nhóm khác như thế nào? Khi khai báo một lớp như vậy, chúng ta sử dụng từ khóa static đã quen thuộc:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       public static int getMaxPassengersCount() {

           return maxPassengersCount;
       }
   }
}
Các lớp lồng nhau tĩnh - 4Trong ví dụ này, chúng ta có một lớp bên ngoài Boeing737tạo ra một chiếc máy bay theo mô hình này. Và anh ta có một hàm tạo với một tham số: năm sản xuất ( int manufactureYear). Ngoài ra còn có một biến tĩnh int maxPassengersCount- số lượng hành khách tối đa. Nó sẽ giống nhau đối với tất cả các máy bay cùng mẫu, vì vậy chúng tôi chỉ cần một bản sao. Ngoài ra, nó còn có một lớp bên trong tĩnh Drawing- bản thiết kế máy bay. Trong lớp này, chúng ta có thể gói gọn tất cả thông tin dịch vụ về máy bay. Trong ví dụ của chúng tôi, để đơn giản, chúng tôi giới hạn nó ở năm sản xuất, nhưng nó có thể chứa nhiều thông tin khác. Các lớp lồng nhau tĩnh - 5Như chúng ta đã thảo luận trong bài giảng trước, việc tạo ra một lớp lồng nhau như vậy sẽ làm tăng khả năng đóng gói và thúc đẩy sự trừu tượng thực tế hơn. Sự khác biệt giữa các lớp lồng nhau tĩnh và không tĩnh là gì? 1. Đối tượng lớp tĩnh Drawingkhông lưu trữ tham chiếu đến một thể hiện cụ thể của lớp bên ngoài. Hãy nhớ lại ví dụ ở bài giảng trước về chiếc xe đạp:
public class Bicycle {

   private String model;
   private int mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
Ở đó chúng ta đã nói về cách SteeringWheelmột tham chiếu đến một đối tượng của lớp bên ngoài (xe đạp) được truyền vào từng phiên bản của lớp bên trong (vô lăng) mà chúng ta không nhận thấy Bicycle. Nếu không có đối tượng của lớp bên ngoài thì đối tượng của lớp bên trong sẽ không thể tồn tại. Điều này không đúng với các lớp lồng nhau tĩnh. Một đối tượng của lớp lồng nhau tĩnh có thể dễ dàng tồn tại độc lập. Về vấn đề này, các lớp tĩnh có tính “độc lập” hơn so với các lớp không tĩnh. Điểm duy nhất là khi tạo một đối tượng như vậy bạn cần chỉ định tên của lớp bên ngoài:
public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
Tại sao chúng ta làm cho lớp học Drawingtĩnh, nhưng trong bài giảng trước lớp học Seat(ghế xe đạp) lại không tĩnh? Giống như lần trước, hãy thêm một chút "triết lý" để hiểu ví dụ :) Không giống như ghế ngồi xe đạp, bản chất của bức vẽ không quá gắn chặt với bản chất của máy bay. Một đồ vật ngồi riêng biệt, không có xe đạp, thường sẽ vô nghĩa (mặc dù không phải lúc nào cũng vậy - chúng ta đã nói về điều này trong bài học trước). Bản chất của bản vẽ tự nó có ý nghĩa. Ví dụ, nó có thể hữu ích cho các kỹ sư lập kế hoạch sửa chữa máy bay. Họ không cần máy bay để lập kế hoạch và có thể được đặt ở bất cứ đâu - chỉ cần một bản vẽ là đủ. Ngoài ra, đối với tất cả các máy bay cùng mẫu thì hình vẽ vẫn sẽ giống nhau nên không có sự kết nối cứng nhắc như ghế ngồi với xe đạp. Do đó, đối tượng Drawingkhông cần liên kết đến một đối tượng máy bay cụ thể. 2. Quyền truy cập khác nhau vào các biến và phương thức của một lớp bên ngoài. Một lớp lồng nhau tĩnh chỉ có thể truy cập các trường tĩnh của lớp bên ngoài. Trong ví dụ của chúng tôi, lớp này Drawingcó một phương thức getMaxPassengersCount()trả về giá trị của biến tĩnh maxPassengersCounttừ một lớp bên ngoài. Tuy nhiên, chúng tôi không thể tạo phương thức getManufactureYear()để Drawingtrả về giá trị manufactureYear. Xét cho cùng, một biến manufactureYearlà không tĩnh, có nghĩa là nó phải thuộc về một thể hiện cụ thể Boeing737. Và như chúng ta đã phát hiện ra, trong trường hợp các lớp lồng nhau tĩnh, đối tượng của lớp bên ngoài có thể dễ dàng bị thiếu. Do đó, hạn chế :) Việc biến tĩnh ở lớp bên ngoài có công cụ sửa đổi truy cập nào không quan trọng. Ngay cả nếu đúng như vậy privatethì vẫn sẽ có quyền truy cập từ một lớp lồng nhau tĩnh. Tất cả những mối quan tâm trên không chỉ liên quan đến việc truy cập vào các biến tĩnh mà còn cả các phương thức tĩnh. QUAN TRỌNG! Từ statictrong khai báo lớp bên trong không có nghĩa là chỉ có thể tạo một đối tượng. Đừng nhầm lẫn các đối tượng với các biến. Nếu chúng ta đang nói về các biến tĩnh, thì đúng vậy, một biến lớp tĩnh chẳng hạn, maxPassangersCounttồn tại trong một bản sao duy nhất. Nhưng khi áp dụng cho một lớp lồng nhau, staticđiều đó chỉ có nghĩa là các đối tượng của nó không chứa các tham chiếu đến các đối tượng của lớp bên ngoài. Và chúng ta có thể tạo bao nhiêu đối tượng tùy thích:
public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
Chúng tôi đã khai báo phương thức này main()trực tiếp trong lớp lồng nhau (không có lý do cụ thể nào cho việc này - chỉ để bạn biết điều đó là có thể) và đã tạo 5 đối tượng Drawing. Mặc dù thực tế là chúng ta không có một đối tượng nào của lớp bên ngoài. Như bạn có thể thấy, không có vấn đề gì cả :) Đầu ra của bảng điều khiển:

Drawing{id=1}
Drawing{id=2}
Drawing{id=3}
Drawing{id=4}
Drawing{id=5}
Điều này kết thúc bài học của chúng tôi! Để đề phòng, tôi sẽ để lại cho bạn một liên kết đến phần về chúng trong tài liệu của Oracle . Đọc nó nếu có bất kỳ điểm không rõ ràng. Bây giờ là lúc để giải quyết một số vấn đề! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION