Lớp Lồng Trong Java: Từ Cơ Bản Đến Lambda

Khái niệm lớp lồng

Lớp lồng (nested class) là một lớp được khai báo bên trong phạm vi của lớp khác. Cơ chế này giúp tổ chức code chặt chẽ hơn, đặc biệt khi một lớp chỉ phục vụ duy nhất một lớp khác và không cần xuất hiện ở nơi khác.

Phân loại lớp lồng

1. Lớp thành viên (Member Inner Class)

Đây là lớp không có từ khóa static, được khai báo trực tiếp trong thân lớp ngoài. Nó giữ tham chiếu ngầm đến instance lớp ngoài, do đó có thể truy cập mọi thành phần của lớp đó. Muốn khởi tạo, bắt buộc phải có instance lớp bao bọc trước.

public class HinhTron {
    private double banKinh = 5.0;
    
    class Diem {
        void hienThiToaDo() {
            System.out.println("Bán kính: " + banKinh);
        }
    }
    
    public static void main(String[] thamSo) {
        HinhTron ht = new HinhTron();
        HinhTron.Diem diem = ht.new Diem();
        diem.hienThiToaDo();
    }
}

2. Lớp tĩnh lồng (Static Nested Class)

Khi thêm static, lớp lồng không còn gắn với instance nữa. Có thể tạo ra độc lập, giống như một lớp thông thường nhưng được đóng gói trong phạm vi namespace của lớp ngoài.

public class MayTinh {
    
    public static class BoXuLy {
        public void khoiDong() {
            System.out.println("CPU khởi động");
        }
    }
    
    public void lapRap() {
        BoXuLy cpu = new BoXuLy();
        cpu.khoiDong();
    }
    
    public static void main(String[] thamSo) {
        BoXuLy cpu = new BoXuLy();
        cpu.khoiDong();
    }
}

Khi import từ gói khác:

import ten.goi.MayTinh.BoXuLy;

public class ThietBiKhac {
    public static void main(String[] thamSo) {
        BoXuLy xuLy = new BoXuLy();
        xuLy.khoiDong();
    }
}

3. Lớp cục bộ (Local Class)

Khai báo bên trong khối lệnh, phương thức hoặc câu điều kiện. Phạm vi truy cập chỉ giới hạn trong khối đó, không thể dùng modifier truy cập. Ưu điểm là có thể đọc các biến cục bộ final hoặc effectively final của phương thức chứa nó.

public class QuanLyNhanVien {
    public String phongBan;
    String chucVu;
    private double luong;
    protected String maSo;
    
    public void xuatBaoCao() {
        final int namKinhNghiem = 3;
        
        class NhanVienTamThoi {
            void inThongTin() {
                System.out.println(phongBan);
                System.out.println(chucVu);
                System.out.println(luong);
                System.out.println(maSo);
                System.out.println("Năm KN yêu cầu: " + namKinhNghiem);
            }
        }
        
        NhanVienTamThoi nv = new NhanVienTamThoi();
        nv.inThongTin();
    }
    
    public static void main(String[] thamSo) {
        QuanLyNhanVien ql = new QuanLyNhanVien();
        ql.xuatBaoCao();
    }
}

4. Lớp ẩn danh (Anonymous Class)

Không có tên, vừa khai báo vừa khởi tạo trong một câu lệnh. Thường dùng để thực thi interface hoặc ghi đè phương thức ngay tại chỗ mà không cần tạo file riêng.

LuongThuc hienThi = new LuongThuc() {
    @Override
    public void chay() {
        System.out.println("Thực thi từ lớp ẩn danh!");
    }
};
new Thread(hienThi).start();

Rút gọn với Lambda

Từ Java 8, nếu interface chỉ có một phương thức trừu tượng (functional interface), có thể thay thế lớp ẩn danh bằng biểu thức lambda ngắn gọn hơn nhiều:

LuongThuc hienThi = () -> System.out.println("Thực thi từ lambda!");
new Thread(hienThi).start();

// Hoặc viết trực tiếp
new Thread(() -> System.out.println("Thực thi từ lambda!")).start();

Thẻ: Java Inner Class Static Nested Class Anonymous Class Lambda Expression

Đăng vào ngày 14 tháng 10 lúc 11:10