Skip to main content

Command Palette

Search for a command to run...

Bài 12: Member Inner Class trong Java

Published
5 min readView as Markdown

I. Định nghĩa và ví dụ cụ thể

Định nghĩa Member Inner Class:

Member Inner Class là một lớp được khai báo bên trong một lớp khác mà không có từ khóa static. Member Inner Class là một phần của đối tượng lớp bao ngoài (outer class) và có thể truy cập trực tiếp vào các biến và phương thức của lớp bao ngoài, kể cả các biến instance.

Ví dụ cụ thể:

public class OuterClass {
    private String outerField = "Outer Field";

    // Member Inner Class
    public class InnerClass {
        public void display() {
            System.out.println("Accessing: " + outerField);
        }
    }

    public void createInnerClassInstance() {
        InnerClass inner = new InnerClass();
        inner.display();
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        outer.createInnerClassInstance();
    }
}

Giải thích:

Trong ví dụ trên, InnerClass là một Member Inner Class bên trong lớp OuterClass. Phương thức display trong InnerClass có thể truy cập trực tiếp biến outerField của lớp bao ngoài. Chúng ta tạo một đối tượng InnerClass từ bên trong lớp OuterClass và gọi phương thức display.

II. Ứng dụng trong thực tế

Các trường hợp sử dụng Member Inner Class:

  1. Mô tả các thực thể phức tạp:

Member Inner Class thường được sử dụng để mô tả các thực thể phức tạp hoặc các phần của một thực thể lớn hơn. Ví dụ, bạn có thể sử dụng Member Inner Class để mô tả các thành phần của một sản phẩm.

public class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public void displayProduct() {
        System.out.println("Product Name: " + name);
        System.out.println("Product Price: $" + price);
    }

    // Member Inner Class
    public class Warranty {
        private int years;

        public Warranty(int years) {
            this.years = years;
        }

        public void displayWarranty() {
            System.out.println("Warranty Period: " + years + " years");
        }
    }

    public static void main(String[] args) {
        Product product = new Product("Laptop", 1200.00);
        Product.Warranty warranty = product.new Warranty(2);

        product.displayProduct();
        warranty.displayWarranty();
    }
}

Giải thích:

Trong ví dụ này, Warranty là một Member Inner Class bên trong lớp Product. Điều này giúp mô tả rõ ràng rằng Warranty là một phần của Product. Chúng ta tạo một đối tượng Warranty từ một đối tượng Product và gọi phương thức displayWarranty để hiển thị thông tin bảo hành.

  1. Đóng gói và bảo mật:

Member Inner Class có thể giúp đóng gói và bảo mật mã nguồn bằng cách giới hạn khả năng truy cập vào các thành phần của lớp bao ngoài. Điều này đặc biệt hữu ích khi bạn muốn ẩn các chi tiết triển khai và chỉ cung cấp các phương thức truy cập cụ thể.

public class BankAccount {
    private String accountNumber;
    private double balance;

    public BankAccount(String accountNumber, double balance) {
        this.accountNumber = accountNumber;
        this.balance = balance;
    }

    public void deposit(double amount) {
        balance += amount;
        System.out.println("Deposited: $" + amount);
    }

    public void withdraw(double amount) {
        if (amount <= balance) {
            balance -= amount;
            System.out.println("Withdrew: $" + amount);
        } else {
            System.out.println("Insufficient balance");
        }
    }

    public void displayBalance() {
        System.out.println("Account Number: " + accountNumber);
        System.out.println("Current Balance: $" + balance);
    }

    // Member Inner Class
    public class Transaction {
        public void makeDeposit(double amount) {
            deposit(amount);
        }

        public void makeWithdrawal(double amount) {
            withdraw(amount);
        }
    }

    public static void main(String[] args) {
        BankAccount account = new BankAccount("123456789", 1000.00);
        BankAccount.Transaction transaction = account.new Transaction();

        account.displayBalance();
        transaction.makeDeposit(200.00);
        account.displayBalance();
        transaction.makeWithdrawal(150.00);
        account.displayBalance();
    }
}

Giải thích:

Trong ví dụ này, Transaction là một Member Inner Class bên trong lớp BankAccount. Điều này giúp giới hạn khả năng truy cập vào các phương thức depositwithdraw từ bên ngoài lớp BankAccount, chỉ thông qua lớp Transaction.

III. Bài tập thực hành

Bài tập: Tạo một hệ thống quản lý khách hàng sử dụng Member Inner Class.

Yêu cầu:

  1. Tạo lớp Customer với các thuộc tính nameemail.

  2. Tạo một Member Inner Class Address với các thuộc tính street, city, và zipCode.

  3. Tạo các phương thức để hiển thị thông tin khách hàng và địa chỉ.

  4. Viết chương trình chính để tạo các đối tượng khách hàng và địa chỉ, sau đó hiển thị thông tin của chúng.

Mã nguồn mẫu:

public class Customer {
    private String name;
    private String email;

    public Customer(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public void displayCustomer() {
        System.out.println("Customer Name: " + name);
        System.out.println("Customer Email: " + email);
    }

    // Member Inner Class
    public class Address {
        private String street;
        private String city;
        private String zipCode;

        public Address(String street, String city, String zipCode) {
            this.street = street;
            this.city = city;
            this.zipCode = zipCode;
        }

        public void displayAddress() {
            System.out.println("Street: " + street);
            System.out.println("City: " + city);
            System.out.println("Zip Code: " + zipCode);
        }
    }

    public static void main(String[] args) {
        Customer customer = new Customer("John Doe", "john.doe@example.com");
        Customer.Address address = customer.new Address("123 Main St", "Springfield", "12345");

        customer.displayCustomer();
        address.displayAddress();
    }
}

Giải thích:

Trong bài tập này, chúng ta tạo một hệ thống quản lý khách hàng sử dụng Member Inner Class. Lớp Address là một Member Inner Class bên trong lớp Customer, giúp mô tả rõ ràng rằng Address là một phần của Customer. Chúng ta tạo một đối tượng Address từ một đối tượng Customer và gọi phương thức displayAddress để hiển thị thông tin địa chỉ.

Tổng kết

Bài học này cung cấp một cái nhìn chi tiết về Member Inner Class trong Java, bao gồm định nghĩa, ứng dụng thực tế và các ví dụ minh họa cụ thể. Việc nắm vững khái niệm này sẽ giúp bạn tổ chức mã nguồn một cách khoa học và tăng khả năng bảo mật, đồng thời cải thiện tính rõ ràng và dễ bảo trì của mã nguồn trong các dự án phần mềm.

More from this blog

devngu

169 posts