Tiếp tục với series bài này mình sẽ tiếp tục giới thiệu với mọi người về Class lồng nhau trong Java.
1. Class lồng nhau là gì?
Java cho phép chúng ta định nghĩa các class lồng đan xen lẫn nhau trong một class. Java gọi đó là nested class (class lồng nhau).
Các class lồng nhau được chia thành 2 loại là tĩnh và không tĩnh.
Trong đó:
- Các class lồng nhau được khai báo static (tĩnh) được gọi là nested class.
- Các class lồng nhau không tĩnh được gọi là inner classes.
VD: class lồng nhau không tĩnh.
class OuterClass {
class NestedClass {
}
}
VD: class lồng nhau tĩnh.
class OuterClass {
static class StaticNestedClass {
}
}
Một class được lồng bên trong một class khác cũng sẽ được coi là một thành phần bên trong class đó.
2. Inner class.
Class lồng nếu không phải là một static thì chúng có thể truy xuất được đến tất cả các thành phần của class bao ngoài nó, kể cả là private
.
Và để khởi tạo một inner class thì các bạn thực hiện theo cú pháp sau:
OuterClass.NestedClass innerObject = outerObject.new NestedClass();
Trong đó:
OuterClass
là class bao ngoài class cần truy vấn.NestedClass
là class được bao bởiOuterClass
.
VD: Khai báo inner class và truy xuất thông tin.
public class ConNguoi {
private String name;
private int age;
public void printInfo() {
System.out.println("Name: " + this.name);
System.out.println("Age: " + this.age);
}
public class TreCon {
public TreCon(String name, int age) {
ConNguoi.this.name = name;
ConNguoi.this.age = age;
}
}
}
Giờ mình tạo thêm một Main
class để chạy chương trình xem sao.
public class Main {
public static void main(String[] args) {
ConNguoi conNguoi = new ConNguoi();
ConNguoi.TreCon treCon = conNguoi.new TreCon("Nguyen Van A", 10);
conNguoi.printInfo();
}
}
// Output
// Name: Nguyen Van A
// Age: 10
Như các bạn đã thấy thì class TreCon
có thể truy vấn đến thông tin name
, age
trong class ConNguoi
mặc dù 2 thuộc tính này là private
.
3. Nested class.
Khác với inner class, class lồng static không truy vấn được đến các thành phần bên trong class bao ngoài nó.
Và để khởi tạo một nested class thì các bạn thực hiện theo cú pháp sau:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
Trong đó:
- OuterClass
là class bao ngoài class cần truy vấn.
- StaticNestedClass
là class được bao bởi OuterClass
.
VD: Mình sẽ thử khai báo một nested class và thử truy vấn như inner class xem sao.
public class ConNguoi {
private String name;
private int age;
public void printInfo() {
System.out.println("Name: " + this.name);
System.out.println("Age: " + this.age);
}
public static class TreCon {
public TreCon(String name, int age) {
ConNguoi.this.name = name;
ConNguoi.this.age = age;
}
}
}
Khi build đoạn code trên thì các bạn sẽ thấy output là 1 error message như sau:
error: non-static variable this cannot be referenced from a static context
Điều này kết luận lại là nested class không thể truy vấn đến class bao ngoài nó.
4. Tại sao lại sử dụng các class lồng nhau?
Các lý do cho việc sử dụng các class lồng nhau bao gồm:
- Đó là một cách hợp lý để nhóm các class chỉ được sử dụng ở một nơi. Nếu một class chỉ hữu ích cho một class khác, thì chúng ta nên nhúng nó vào class đó và giữ hai class đó lại với nhau. Việc lồng các class như vậy làm cho package của chúng ta được sắp xếp hợp lý hơn.
- Nó làm tăng tính đóng gói. Ví dụ chúng ta có 2 class A và B, trong đó B cần quyền truy cập vào các thành viên của A mà nếu không sẽ được khai báo là private
. Bằng cách ẩn class B trong class A, các thành phần của A có thể được khai báo là private
và B có thể truy cập chúng. Ngoài ra, bản thân B có thể bị ẩn so với bên ngoài.
- Nó có thể giúp code dễ đọc và dễ bảo trì hơn. Vì việc lồng các class nhỏ trong các class sẽ đặt mã gần hơn với nơi nó được sử dụng.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
0 Comments