java class lồng class

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.

  • Non-static nested class (inner class)
  • Static nested class

Đề xuất đọc :

  • Java Access Modifiers
  • Java Static Keyword

Đầ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.

Vì 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 :

Processor Cache = 4.3
Ram Clock speed = 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,

  • we first created an instance of an outer class CPU named cpu.
  • Using the instance of the outer class, we then created objects of inner classes:
     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 bên 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 :

Engine Type for 8WD= Bigger
Engine Type for 4WD = Smaller

Trong chương trình trên, chúng ta có lớp bên trong có tên là Độ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 bên 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 :

Total Ports = 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 bên 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: non-static variable this cannot be referenced from a static context

Điều này là do chúng ta không sử dụng đối tượng của lớp bên ngoài để tạo một đối tượng của lớp bên trong. Do đó, không có tham chiếu đến lớp bên ngoài Motherboardđược lưu trữ trong Motherboard.this.

Những điểm chính cần nhớ

  • Java coi lớp bên trong như một thành viên bình thường của một lớp. Chúng giống như các phương thức và biến được khai báo bên trong một lớp.
  • Vì các lớp bên trong là thành viên của lớp bên ngoài, bạn có thể áp dụng bất kỳ công cụ sửa đổi quyền truy cập nào như private, protected cho lớp bên trong của bạn, điều không thể thực hiện được trong các lớp bình thường.
  • Vì lớp lồng nhau là thành viên của lớp ngoài bao quanh nó, bạn có thể sử dụng ký hiệu dấu chấm (.) Để truy cập lớp lồng nhau và các thành viên của nó.
  • Sử dụng lớp lồng nhau sẽ làm cho mã của bạn dễ đọc hơn và cung cấp khả năng đóng gói tốt hơn.
  • 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ư.








Gõ tìm kiếm nhanh...