CodeGym /Blog Java /Ngẫu nhiên /Các lớp bên trong Java
John Squirrels
Mức độ
San Francisco

Các lớp bên trong Java

Xuất bản trong nhóm
Trong Java một số lớp có thể chứa các lớp khác bên trong chúng. Các lớp như vậy được gọi là các lớp lồng nhau. Các lớp được định nghĩa trong các lớp khác thường rơi vào hai loại - tĩnh và không tĩnh. Các lớp không tĩnh lồng nhau được gọi là bên trong. Các lớp lồng nhau được khai báo tĩnh được gọi là các lớp lồng nhau tĩnh. Trên thực tế, không có gì phức tạp ở đây, mặc dù thuật ngữ này có vẻ hơi mơ hồ và đôi khi có thể khiến ngay cả một nhà phát triển phần mềm chuyên nghiệp nhầm lẫn.

Các lớp lồng nhau và bên trong

Vì vậy tất cả các lớp nằm bên trong các lớp khác được gọi là các lớp lồng nhau.
class OuterClass {
    ...
    class NestedClass {
        ...
    }
}
Các lớp lồng nhau không tĩnh được gọi là Lớp bên trong và các lớp tĩnh được gọi là Lớp lồng nhau tĩnh . Các lớp bên trong Java - 1
class OuterClass {
    ...
    static class StaticNestedClass {
        ...
    }
    class InnerClass {
        ...
    }
}
Do đó, tất cả các Lớp bên trong đều được lồng nhau, nhưng không phải tất cả các Lớp lồng nhau đều là Lớp bên trong. Đây là những định nghĩa chính. Các lớp bên trong là một loại cơ chế bảo mật trong Java. Chúng tôi biết rằng một lớp thông thường không thể được liên kết với một công cụ sửa đổi truy cập riêng tư. Tuy nhiên, nếu lớp của chúng ta là thành viên của một lớp khác thì lớp bên trong có thể được đặt ở chế độ riêng tư. Tính năng này cũng được sử dụng để truy cập các thành viên lớp riêng tư.

Ví dụ về lớp bên trong

Vì vậy, hãy thử tạo một số lớp và bên trong nó — một lớp khác. Hãy tưởng tượng một số loại bảng điều khiển trò chơi mô-đun. Bản thân nó có một “hộp” và một số mô-đun nhất định có thể được kết nối với nó. Ví dụ: bộ điều khiển trò chơi, vô lăng, mũ bảo hiểm VR, theo quy định, không hoạt động nếu không có bảng điều khiển. Ở đây chúng ta có lớp GameConsole. Nó có 2 trường và 1 phương thức — start() . Sự khác biệt giữa GameCosole và lớp chúng ta quen thuộc là nó có lớp GameController nội bộ .
public class GameConsole {
    private String model;
    private int weight;

    public void run() {
        System.out.println("Game console is on");
    }


    public class GameController {

        private String color;

        public void start() {
            System.out.println("start button is pressed");
        }

        public void x() {
            System.out.println("x button is pressed");
        }

        public void y() {
            System.out.println("y button is pressed");
        }
        public void a() {
            System.out.println("a button is pressed");
        }

        public void b() {
            System.out.println("b button is pressed");
        }
        public void mover() {
            System.out.println("mover button is pressed");
        }

    }

}
Tại thời điểm này, bạn có thể thắc mắc: tại sao không tách các lớp này thành "tách biệt"? Không cần thiết phải làm cho chúng lồng vào nhau. Quả thực là có thể. Đúng hơn, đó là về việc thiết kế chính xác các lớp theo cách sử dụng chúng. Các lớp bên trong được tạo để làm nổi bật trong chương trình một thực thể được liên kết chặt chẽ với một thực thể khác. Bộ điều khiển hoặc mũ bảo hiểm VR chẳng hạn là các thành phần của bảng điều khiển. Có, chúng có thể được mua riêng khỏi bảng điều khiển, nhưng không thể sử dụng nếu không có bảng điều khiển. Nếu chúng ta tách tất cả các lớp này thành các lớp công khai riêng biệt, thì chương trình của chúng ta có thể có đoạn mã sau:
public class Main {

   public static void main(String[] args) {
       GameController controller = new GameController();
       controller.x();
   }
}
Điều gì xảy ra trong trường hợp này vẫn chưa rõ ràng, vì bản thân bộ điều khiển không hoạt động nếu không có bảng điều khiển. Chúng tôi đã tạo một đối tượng bảng điều khiển trò chơi. Chúng tôi đã tạo đối tượng phụ của nó — bộ điều khiển trò chơi. Và bây giờ chúng ta có thể chơi, chỉ cần nhấn đúng phím. Các phương thức chúng ta cần được gọi trên đúng đối tượng. Mọi thứ đều đơn giản và thuận tiện. Trong ví dụ này, việc trích xuất bộ điều khiển trò chơi sẽ tăng cường khả năng đóng gói (chúng tôi ẩn thông tin chi tiết về các bộ phận của bảng điều khiển bên trong lớp tương ứng) và cho phép trừu tượng hóa chi tiết hơn. Nhưng chẳng hạn, nếu chúng tôi tạo một chương trình mô phỏng một cửa hàng nơi bạn có thể mua riêng mũ bảo hiểm hoặc bộ điều khiển VR, thì ví dụ này sẽ thất bại. Ở đó tốt hơn là tạo một bộ điều khiển trò chơi riêng biệt. Hãy lấy một ví dụ khác. Chúng tôi đã đề cập ở trên rằng chúng tôi có thể đặt lớp bên trong ở chế độ riêng tư và vẫn gọi nó từ lớp bên ngoài. Dưới đây là một ví dụ về các lớp như vậy.
class OuterClass {

   // inner class
   private class InnerClass {
       public void print() {
           System.out.println("We are in the inner class...");
       }
   }

   // method of outer class. We are create an inner class from the method of outer one
   void display() {
       InnerClass inner = new InnerClass();
       inner.print();
   }
}
Ở đây OuterClass là lớp bên ngoài, InnerClass là lớp bên trong, display() là phương thức bên trong mà chúng ta đang tạo một đối tượng của lớp bên trong. Bây giờ hãy viết một lớp demo với phương thức main nơi chúng ta sẽ gọi phương thức display() .
public class OuterDemoMain {

       public static void main(String args[]) {
           // create an object of the outer class
           OuterDemo outer = new OuterDemo();

           outer.display();
       }
}
Nếu bạn chạy chương trình này, bạn sẽ nhận được kết quả sau:
Chúng ta đang ở lớp trong...

Phân loại lớp bên trong

Bản thân các lớp bên trong hoặc các lớp không tĩnh lồng nhau được chia thành ba nhóm.
  • Lớp bên trong như vậy. Chỉ một lớp không tĩnh bên trong lớp kia như chúng tôi đã trình bày ở trên với ví dụ về GameConsoleGameController .
  • Lớp bên trong phương thức cục bộ là một lớp bên trong một phương thức.
  • Lớp bên trong ẩn danh.
Các lớp bên trong Java - 2

Phương thức lớp bên trong cục bộ

Trong Java bạn có thể viết một lớp bên trong một phương thức và đó là kiểu cục bộ. Giống như các biến cục bộ, phạm vi của lớp bên trong bị giới hạn trong một phương thức. Lớp bên trong phương thức cục bộ chỉ có thể được tạo trong phương thức mà lớp bên trong được xác định. Hãy trình bày cách sử dụng lớp bên trong của phương thức cục bộ.
public class OuterDemo2 {

   //instance method of the outer class OuterDemo2
   void myMethod() {
       String str = "and it's a value from OuterDemo2 class' myMethod ";

       // method-local inner class
       class methodInnerDemo {
           public void print() {
               System.out.println("Here we've got a method inner class... " );
               System.out.println(str);

           }
       }

       // Access to the inner class
       methodInnerDemo inn = new methodInnerDemo();
       inn.print();
   }
}
Bây giờ chúng ta sẽ viết một lớp demo với một phương thức chính nơi chúng ta sẽ gọi phương thức external() .
public class OuterDemoMain {


   public static void main(String args[]) {
       OuterDemo2 outer = new OuterDemo2();
       outer.myMethod();
   }
}
Đầu ra là:
Ở đây chúng ta có một phương thức lớp bên trong... và đó là một giá trị từ myMethod của lớp OuterDemo2

Lớp bên trong ẩn danh

Lớp bên trong được khai báo không có tên lớp được gọi là lớp bên trong ẩn danh. Khi chúng ta khai báo một lớp bên trong ẩn danh, chúng ta sẽ khởi tạo nó ngay lập tức. Thông thường, các lớp như vậy được sử dụng bất cứ khi nào bạn cần ghi đè một lớp hoặc phương thức giao diện.
abstract class OuterDemo3 {
   public abstract void method();

}
   class outerClass {

       public static void main(String args[]) {
           OuterDemo3 inner = new OuterDemo3() {
               public void method() {
                   System.out.println("Here we've got an example of an  anonymous inner class");
               }
           };
           inner.method();
       }
   }
Đầu ra ở đây:
Ở đây chúng ta có một ví dụ về lớp bên trong ẩn danh...

Lớp bên trong ẩn danh làm đối số

Bạn cũng có thể chuyển một lớp bên trong ẩn danh làm đối số cho phương thức. Đây là một ví dụ.
interface OuterDemo4 {
       String hello();
   }

   class NewClass {
       // accepts the object of interface
       public void displayMessage(OuterDemo4 myMessage) {
           System.out.println(myMessage.hello());
           System.out.println("example of anonymous inner class as an argument");
       }

       public static void main(String args[]) {
           NewClass newClass = new NewClass();

           //here we pass an anonymous inner class as an argument
           newClass.displayMessage(new OuterDemo4() {
               public String hello() {
                   return "Hello!";
               }
           });
       }
}
Đầu ra ở đây:
Xin chào! ví dụ về lớp bên trong ẩn danh làm đối số
Để củng cố những gì bạn đã học, chúng tôi khuyên bạn nên xem bài học video từ Khóa học Java của chúng tôi
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION