CodeGym/Blog Java/Ngẫu nhiên/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
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 tập trước, chúng ta đã nói về các lớp lồng nhau không tĩnh, còn được gọi là các lớp bên trong Các lớp lồng nhau tĩnh - 1Hôm nay chúng ta chuyển sang một nhóm lớp khác. Chúng tôi sẽ xem xét các lớp lồng nhau tĩnh. Các lớp lồng nhau tĩnh - 3Chúng khác với các lớp khác như thế nào? Khi khai báo loại lớp này, chúng tôi sử dụng từ khóa tĩnh mà bạn đã 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ó Boeing737lớp bên ngoài, đại diện cho một chiếc máy bay loại này. Nó 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: số lượng hành khách tối đa ( int maxPassengersCount). Nó sẽ có cùng giá trị cho tất cả các mặt phẳng của cùng một mô hình, vì vậy chúng ta chỉ cần một thể hiện. Ngoài ra, nó có một lớp lồng tĩnh: Drawing(đại diện cho các bản thiết kế kỹ thuật của máy bay). Chúng tôi sử dụng lớp này để đóng gói tất cả các thông tin chính thức về máy bay. Trong ví dụ của chúng tôi, để đơn giản, chúng tôi đã giới hạn lớp này trong 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 đã nói trong bài học trước, việc tạo một lớp lồng nhau như vậy sẽ cải thiện khả năng đóng gói và góp phần tạo nên 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. Một đối tượng của Drawinglớp tĩnh khô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ụ về chiếc xe đạp trong bài học trước:
public class Bicycle {

   private String model;
   private int maxWeight;

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

   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
Trong bài học đó, chúng ta đã nói về thực tế là mỗi thể hiện của Handlebarlớp bên trong, chúng ta không thể nhận thấy, chuyển một tham chiếu đến thể hiện của Bicyclelớp bên ngoài. Không có một thể hiện của lớp bên ngoài, một đối tượng của lớp bên trong đơn giản là không thể tồn tại. Đối với các lớp lồng tĩnh, đây không phải là trường hợp. Một đối tượng của lớp lồng tĩnh hoàn toàn có khả năng tự tồn tại. Về vấn đề này, các lớp tĩnh "độc lập" hơn không tĩnh. Điều duy nhất bạn cần biết là khi tạo một đối tượng như vậy, bạn phải 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 Drawinglớp tĩnh khi trong bài học trước chúng ta đã làmSeatlớp (đại diện cho ghế xe đạp) không tĩnh? Như lần trước, hãy thêm một chút "triết học" để hiểu ví dụ :) Khác với yên xe đạp, khái niệm bản vẽ kỹ thuật không bị ràng buộc cứng nhắc với khái niệm máy bay. Nếu không có xe đạp, một đối tượng ghế ngồi riêng cho xe đạp thường trở nên 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 thân khái niệm về một bản vẽ kỹ thuật có ý nghĩa. Ví dụ, nó có thể hữu ích cho các kỹ sư lập kế hoạch bảo trì máy bay. Máy bay không cần thiết để lập kế hoạch và có thể được đặt ở bất cứ đâu. Chỉ cần bản vẽ kỹ thuật. Ngoài ra, tất cả các máy bay cùng kiểu sẽ có cùng một bản vẽ kỹ sư, vì vậy không có mối quan hệ chặt chẽ nào tồn tại với ghế xe đạp. Do đó, mộtDrawingđối tượng không cần tham chiếu đến một đối tượng máy bay cụ thể. 2. Truy cập khác nhau đến các biến và phương thức của lớp bên ngoài. Một lớp lồng tĩnh chỉ có thể truy cập các trường tĩnh của một lớp bên ngoài. Trong ví dụ của chúng ta, Drawinglớp có một getMaxPassengersCount()phương thức trả về giá trị của maxPassengersCountbiến tĩnh của lớp bên ngoài. Tuy nhiên, chúng ta không thể tạo một getManufactureYear()phương thức trong Drawinglớp để trả về giá trị của manufactureYear. Rốt cuộc, manufactureYearbiến không tĩnh, có nghĩa là nó phải thuộc về một thể hiện cụ thể của 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 vắng mặt. Do đó, giới hạn :) Việc một biến tĩnh có công cụ sửa đổi truy cập nào ở lớp bên ngoài không quan trọng. Thậm chí nếu nó làprivate, một lớp lồng tĩnh sẽ vẫn có quyền truy cập. Tất cả những điều trên không chỉ áp dụng cho việc truy cập vào các biến tĩnh mà còn cho các phương thức tĩnh. QUAN TRỌNG! Trong phần khai báo của lớp bên trong, statictừ khóa không có nghĩa là bạn 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ề biến tĩnh, thì, vâng, tồn tại một thể hiện duy nhất của biến lớp tĩnh, ví dụ: maxPassangersCount. Nhưng khi staticđược áp dụng cho một lớp lồng nhau, đ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ự 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 main()phương thức trực tiếp trong lớp lồng nhau (không có lý do đặc biệt nào cho điều này — chỉ để cho bạn biết rằng điều này là có thể) và tạo 5 Drawingđối tượng. 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, điều này không tạo ra bất kỳ vấn đề nào :) Đầ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}
Và điều đó 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 . Nếu một cái gì đó vẫn còn chưa rõ ràng, đọc nó. Bây giờ là lúc để tôi giải quyết một vài nhiệm vụ! :)
Bình luận
  • Phổ biến
  • Mới
Bạn phải đăng nhập để đăng nhận xet
Trang này chưa có bất kỳ bình luận nào