Lớp bên trong và lồng nhau của Java (Có ví dụ)

Trong hướng dẫn này, bạn sẽ tìm hiểu về lớp lồng nhau trong Java và các kiểu của nó với sự trợ giúp của các ví dụ.

Trong Java, bạn có thể định nghĩa một lớp trong một lớp khác. Lớp như vậy được gọi là nested class. Ví dụ,

 class OuterClass ( //… class NestedClass ( //… ) )

Có hai loại lớp lồng nhau mà bạn có thể tạo trong Java.

  • Lớp lồng nhau không tĩnh (lớp bên trong)
  • Lớp lồng nhau tĩnh

Đề xuất đọc :

  • Java Access Modifier
  • Từ khóa tĩnh Java

Đầu tiên chúng ta hãy xem xét các lớp lồng nhau không tĩnh.

Lớp lồng nhau không tĩnh (Lớp bên trong)

Một lớp lồng nhau không tĩnh là một lớp nằm trong một lớp khác. Nó có quyền truy cập vào các thành viên của lớp bao quanh (lớp ngoài). Nó thường được gọi là inner class.

inner classtồn tại bên trong lớp bên ngoài, bạn phải khởi tạo lớp bên ngoài trước, để khởi tạo lớp bên trong.

Đây là một ví dụ về cách bạn có thể khai báo các lớp bên trong trong Java.

Ví dụ 1: Lớp bên trong

 class CPU ( double price; // nested class class Processor( // members of nested class double cores; String manufacturer; double getCache()( return 4.3; ) ) // nested protected class protected class RAM( // members of protected nested class double memory; String manufacturer; double getClockSpeed()( return 5.5; ) ) ) public class Main ( public static void main(String() args) ( // create object of Outer class CPU CPU cpu = new CPU(); // create an object of inner class Processor using outer class CPU.Processor processor = cpu.new Processor(); // create an object of inner class RAM using outer class CPU CPU.RAM ram = cpu.new RAM(); System.out.println("Processor Cache = " + processor.getCache()); System.out.println("Ram Clock speed = " + ram.getClockSpeed()); ) )

Đầu ra :

 Bộ nhớ đệm bộ xử lý = 4,3 Ram Tốc độ xung nhịp = 5,5

Trong chương trình trên, có hai lớp lồng nhau: Bộ xử lý và RAM bên trong lớp ngoài: CPU. Chúng ta có thể khai báo lớp bên trong là lớp được bảo vệ. Do đó, chúng tôi đã khai báo lớp RAM là được bảo vệ.

Bên trong lớp Chính,

  • lần đầu tiên chúng tôi tạo một phiên bản của CPU lớp ngoài có tên là cpu.
  • Sử dụng thể hiện của lớp bên ngoài, sau đó chúng tôi tạo các đối tượng của các lớp bên trong:
     CPU.Processor processor = cpu.new Processor; CPU.RAM ram = cpu.new RAM();

Lưu ý : Chúng tôi sử dụng .toán tử dot ( ) để tạo một thể hiện của lớp bên trong bằng cách sử dụng lớp bên ngoài.

Tiếp cận các thành viên của Lớp bên ngoài trong Lớp bên trong

Chúng ta có thể truy cập các thành viên của lớp ngoài bằng cách sử dụng từ khóa này. Nếu bạn muốn tìm hiểu về từ khóa này, hãy truy cập Java từ khóa này.

Ví dụ 2: Truy cập thành viên

 class Car ( String carName; String carType; // assign values using constructor public Car(String name, String type) ( this.carName = name; this.carType = type; ) // private method private String getCarName() ( return this.carName; ) // inner class class Engine ( String engineType; void setEngine() ( // Accessing the carType property of Car if(Car.this.carType.equals("4WD"))( // Invoking method getCarName() of Car if(Car.this.getCarName().equals("Crysler")) ( this.engineType = "Smaller"; ) else ( this.engineType = "Bigger"; ) )else( this.engineType = "Bigger"; ) ) String getEngineType()( return this.engineType; ) ) ) public class Main ( public static void main(String() args) ( // create an object of the outer class Car Car car1 = new Car("Mazda", "8WD"); // create an object of inner class using the outer class Car.Engine engine = car1.new Engine(); engine.setEngine(); System.out.println("Engine Type for 8WD= " + engine.getEngineType()); Car car2 = new Car("Crysler", "4WD"); Car.Engine c2engine = car2.new Engine(); c2engine.setEngine(); System.out.println("Engine Type for 4WD = " + c2engine.getEngineType()); ) )

Đầu ra :

 Loại động cơ cho 8WD = Loại động cơ lớn hơn cho 4WD = Nhỏ hơn

Trong chương trình trên, chúng ta có lớp bên trong có tên Động cơ bên trong Xe lớp bên ngoài. Ở đây, hãy để ý dòng,

 if(Car.this.carType.equals("4WD")) (… )

Chúng tôi đang sử dụng thistừ khóa để truy cập biến carType của lớp ngoài. Bạn có thể nhận thấy rằng thay vì sử dụng this.carTypechúng tôi đã sử dụng Car.this.carType.

Đó là bởi vì nếu chúng ta không đề cập đến tên của Xe lớp bên ngoài, thì thistừ khóa sẽ đại diện cho thành viên bên trong lớp bên trong.

Tương tự, chúng ta cũng đang truy cập phương thức của lớp ngoài từ lớp bên trong.

 if (Car.this.getCarName().equals("Crysler") (… )

Điều quan trọng cần lưu ý là, mặc dù phương thức getCarName()là một privatephương thức, chúng ta có thể truy cập nó từ lớp bên trong.

Lớp lồng nhau tĩnh

Trong Java, chúng ta cũng có thể định nghĩa một staticlớp bên trong một lớp khác. Lớp như vậy được gọi là static nested class. Các lớp lồng nhau tĩnh không được gọi là các lớp bên trong tĩnh.

Không giống như lớp bên trong, lớp lồng nhau tĩnh không thể truy cập các biến thành viên của lớp bên ngoài. Đó là vì lớp lồng nhau tĩnh không yêu cầu bạn tạo một thể hiện của lớp bên ngoài.

 OuterClass.NestedClass obj = new OuterClass.NestedClass();

Ở đây, chúng ta đang tạo một đối tượng của lớp lồng nhau tĩnh bằng cách sử dụng tên lớp của lớp bên ngoài. Do đó, lớp ngoài không thể được tham chiếu bằng cách sử dụng OuterClass.this.

Ví dụ 3: Lớp bên trong tĩnh

 class MotherBoard ( // static nested class static class USB( int usb2 = 2; int usb3 = 1; int getTotalPorts()( return usb2 + usb3; ) ) ) public class Main ( public static void main(String() args) ( // create an object of the static nested class // using the name of the outer class MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); ) )

Đầu ra :

 Tổng số cổng = 3

Trong chương trình trên, chúng ta đã tạo một lớp tĩnh có tên là USB bên trong lớp MotherBoard. Lưu ý dòng,

 MotherBoard.USB usb = new MotherBoard.USB();

Ở đây, chúng tôi đang tạo một đối tượng của USB bằng cách sử dụng tên của lớp bên ngoài.

Bây giờ, hãy xem điều gì sẽ xảy ra nếu bạn cố gắng truy cập vào các thành viên của lớp ngoài:

Ví dụ 4: Truy cập các thành viên của lớp ngoài bên trong lớp bên trong tĩnh

 class MotherBoard ( String model; public MotherBoard(String model) ( this.model = model; ) // static nested class static class USB( int usb2 = 2; int usb3 = 1; int getTotalPorts()( // accessing the variable model of the outer classs if(MotherBoard.this.model.equals("MSI")) ( return 4; ) else ( return usb2 + usb3; ) ) ) ) public class Main ( public static void main(String() args) ( // create an object of the static nested class MotherBoard.USB usb = new MotherBoard.USB(); System.out.println("Total Ports = " + usb.getTotalPorts()); ) )

Khi chúng tôi cố gắng chạy chương trình, chúng tôi sẽ gặp lỗi:

 error: biến non-static này không thể được tham chiếu từ ngữ cảnh tĩnh

This is because we are not using the object of the outer class to create an object of the inner class. Hence, there is no reference to the outer class Motherboard stored in Motherboard.this.

Key Points to Remember

  • Java treats the inner class as a regular member of a class. They are just like methods and variables declared inside a class.
  • Since inner classes are members of the outer class, you can apply any access modifiers like private, protected to your inner class which is not possible in normal classes.
  • Since the nested class is a member of its enclosing outer class, you can use the dot (.) notation to access the nested class and its members.
  • Using the nested class will make your code more readable and provide better encapsulation.
  • Các lớp lồng nhau không tĩnh (các lớp bên trong) có quyền truy cập vào các thành viên khác của lớp bên ngoài / bao quanh, ngay cả khi chúng được khai báo là riêng tư.

thú vị bài viết...