Bài 11: Static Nested Class trong Java
I. Định nghĩa và ví dụ cụ thể
Định nghĩa Static Nested Class:
Static Nested Class là một lớp được khai báo bên trong một lớp khác với từ khóa static. Static Nested Class không có quyền truy cập vào các biến instance của lớp bao ngoài (outer class) và có thể được khởi tạo mà không cần một đối tượng của lớp bao ngoài.
Ví dụ cụ thể:
public class OuterClass {
private static String staticOuterField = "Static Outer Field";
private String instanceOuterField = "Instance Outer Field";
// Static Nested Class
public static class NestedStaticClass {
public void display() {
// Có thể truy cập biến static của lớp bao ngoài
System.out.println("Accessing: " + staticOuterField);
// Không thể truy cập biến instance của lớp bao ngoài
// System.out.println("Accessing: " + instanceOuterField); // Lỗi biên dịch
}
}
public static void main(String[] args) {
// Khởi tạo Static Nested Class mà không cần đối tượng của OuterClass
OuterClass.NestedStaticClass nestedObject = new OuterClass.NestedStaticClass();
nestedObject.display();
}
}
Giải thích:
Trong ví dụ trên, NestedStaticClass là một lớp lồng nhau tĩnh bên trong lớp OuterClass. Phương thức display trong NestedStaticClass có thể truy cập biến tĩnh staticOuterField của lớp bao ngoài nhưng không thể truy cập biến instance instanceOuterField của lớp bao ngoài.
II. Ứng dụng trong thực tế
Các trường hợp sử dụng Static Nested Class:
- Nhóm các lớp liên quan:
Static Nested Class thường được sử dụng để nhóm các lớp có liên quan với nhau, giúp mã nguồn trở nên gọn gàng và có tổ chức hơn. Ví dụ, bạn có thể nhóm các lớp dùng để biểu diễn một bộ phận và các chi tiết của nó.
public class Car {
private String model;
private String color;
public Car(String model, String color) {
this.model = model;
this.color = color;
}
public static class Engine {
private int horsepower;
public Engine(int horsepower) {
this.horsepower = horsepower;
}
public void display() {
System.out.println("Engine horsepower: " + horsepower);
}
}
public void display() {
System.out.println("Car model: " + model);
System.out.println("Car color: " + color);
}
public static void main(String[] args) {
Car car = new Car("Tesla Model S", "Red");
Car.Engine engine = new Car.Engine(670);
car.display();
engine.display();
}
}
Giải thích:
Trong ví dụ này, lớp Engine là một Static Nested Class bên trong lớp Car. Điều này giúp nhóm các chi tiết liên quan đến Car vào cùng một lớp bao ngoài, làm cho mã nguồn trở nên có tổ chức hơn.
- Tăng tính bảo mật:
Static Nested Class giúp tăng tính bảo mật bằng cách giới hạn khả năng truy cập của lớp lồng nhau. Lớp lồng nhau chỉ có thể truy cập các thành phần static của lớp bao ngoài, giúp bảo vệ các thành phần không cần thiết của lớp bao ngoài.
public class BankAccount {
private static double interestRate = 3.5;
private double balance;
public BankAccount(double balance) {
this.balance = balance;
}
public static class InterestCalculator {
public double calculateInterest(double amount) {
return amount * (interestRate / 100);
}
}
public double getBalance() {
return balance;
}
public void applyInterest() {
InterestCalculator calculator = new InterestCalculator();
balance += calculator.calculateInterest(balance);
}
public static void main(String[] args) {
BankAccount account = new BankAccount(1000);
account.applyInterest();
System.out.println("Balance after interest: " + account.getBalance());
}
}
Giải thích:
Trong ví dụ này, lớp InterestCalculator là một Static Nested Class bên trong lớp BankAccount. Lớp InterestCalculator chỉ có thể truy cập biến static interestRate của lớp bao ngoài. Điều này giúp bảo vệ biến instance balance của lớp BankAccount.
III. Bài tập thực hành
Bài tập: Tạo một hệ thống quản lý sách sử dụng Static Nested Class.
Yêu cầu:
Tạo một lớp
Libraryvới biến tĩnhlibraryNamevà biến instancebooks.Tạo một Static Nested Class
Bookvới các thuộc tínhtitlevàauthor.Tạo các phương thức để thêm sách vào thư viện và hiển thị thông tin sách.
Viết chương trình chính để tạo các đối tượng thư viện và sách, sau đó hiển thị thông tin của chúng.
Mã nguồn mẫu:
import java.util.ArrayList;
import java.util.List;
public class Library {
private static String libraryName = "City Library";
private List<Book> books = new ArrayList<>();
// Static Nested Class
public static class Book {
private String title;
private String author;
public Book(String title, String author) {
this.title = title;
this.author = author;
}
public void display() {
System.out.println("Book Title: " + title);
System.out.println("Book Author: " + author);
}
}
public void addBook(Book book) {
books.add(book);
}
public void displayBooks() {
System.out.println("Library: " + libraryName);
for (Book book : books) {
book.display();
System.out.println();
}
}
public static void main(String[] args) {
Library library = new Library();
Library.Book book1 = new Library.Book("Effective Java", "Joshua Bloch");
Library.Book book2 = new Library.Book("Clean Code", "Robert C. Martin");
library.addBook(book1);
library.addBook(book2);
library.displayBooks();
}
}
Giải thích:
Trong bài tập này, chúng ta tạo một hệ thống quản lý sách sử dụng Static Nested Class. Lớp Book là một Static Nested Class bên trong lớp Library. Chúng ta có thể thêm các sách vào thư viện và hiển thị thông tin của chúng mà không cần phải tạo một đối tượng của lớp bao ngoài Library để truy cập lớp Book.
Tổng kết
Bài học này cung cấp một cái nhìn chi tiết về Static Nested 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à bảo mật hơn, đồng thời tăng khả năng tái sử dụng mã nguồn trong các dự án phần mềm.