| Loại | Mô tả |
|---|---|
| Static Nested Class | Inner class được khai báo bên trong một lớp nhưng được đánh dấu với từ khóa static. Không thể truy cập trực tiếp các thành viên không static của lớp bao bọc. |
| Member Inner Class | Inner class được khai báo bên trong một lớp như một thành viên của lớp đó. Có thể truy cập tất cả các thành viên (fields và methods) của lớp bao bọc và cũng có thể truy cập các biến local của phương thức bao bọc. |
| Local Inner Class | Inner class được khai báo bên trong một phương thức. Chỉ có thể truy cập trong phương thức bao bọc. |
| Anonymous Inner Class | Inner class không có tên, được khai báo và khởi tạo ngay tại chỗ mà không cần định nghĩa riêng biệt. Thường được sử dụng khi bạn cần triển khai một interface hoặc một lớp trừu tượng mà không cần tạo một lớp mới. |
class Outer {
static int outerVariable = 10;
// Static nested class
static class Inner {
void display() {
System.out.println("Outer variable: " + outerVariable);
}
}
public static void main(String[] args) {
// Khởi tạo một đối tượng của static nested class từ bên ngoài của lớp Outer
Outer.Inner innerObject = new Outer.Inner();
// Gọi phương thức display của static nested class
innerObject.display();
}
}Trong ví dụ này, lớp Inner được nhúng (nested) trong lớp Outer. Nó được khai báo là static, do đó có thể truy cập trực tiếp từ bên ngoài lớp Outer mà không cần tạo một đối tượng của lớp Outer trước. Phương thức display của lớp Inner có thể truy cập và sử dụng biến static outerVariable của lớp Outer.
Dưới đây là một ví dụ về Member Inner Class trong Java:
class Outer {
int outerVariable = 10;
// Member inner class
class Inner {
void display() {
System.out.println("Outer variable: " + outerVariable);
}
}
public static void main(String[] args) {
// Khởi tạo một đối tượng của member inner class từ bên trong của lớp Outer
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
// Gọi phương thức display của member inner class
innerObject.display();
}
}Trong ví dụ này, lớp Inner là một Member Inner Class của lớp Outer. Điều này có nghĩa là để tạo một đối tượng của lớp Inner, chúng ta phải sử dụng một đối tượng của lớp Outer đã tồn tại. Phương thức display của lớp Inner có thể truy cập và sử dụng biến outerVariable của lớp Outer.
3. Local Inner Class :
public class Outer {
private int outerVariable = 10;
public void display() {
// Local inner class
class Inner {
void innerDisplay() {
System.out.println("Outer variable: " + outerVariable);
}
}
// Khởi tạo một đối tượng của local inner class trong phương thức display()
Inner innerObject = new Inner();
// Gọi phương thức innerDisplay() của local inner class
innerObject.innerDisplay();
}
public static void main(String[] args) {
// Khởi tạo một đối tượng của lớp Outer
Outer outerObject = new Outer();
// Gọi phương thức display() của lớp Outer
outerObject.display();
}
}Trong ví dụ này, lớp Inner là một Local Inner Class được khai báo trong phương thức display() của lớp Outer. Điều này có nghĩa là lớp Inner chỉ có thể truy cập và sử dụng trong phạm vi của phương thức display() và không thể truy cập từ bên ngoài phương thức này. Phương thức innerDisplay() của lớp Inner có thể truy cập và sử dụng biến outerVariable của lớp Outer.
4. Anonymous Inner Class :
interface Greeting {
void greet();
}
public class Main {
public static void main(String[] args) {
// Khai báo và triển khai một anonymous inner class từ một interface
Greeting greeting = new Greeting() {
@Override
public void greet() {
System.out.println("Hello from Anonymous Inner Class!");
}
};
// Gọi phương thức greet() của anonymous inner class
greeting.greet();
}
}Trong ví dụ này, chúng ta đã triển khai một anonymous inner class từ interface Greeting và triển khai phương thức greet() của nó. Anonymous inner class này không có tên và được tạo ra và triển khai ngay tại chỗ. Điều này giúp giảm bớt sự phức tạp khi chỉ cần triển khai một lần và không cần sử dụng nó ở nơi khác.

Không có nhận xét nào:
Đăng nhận xét