Java Inner Classes (Các lớp bên trong Java)
Trong Java, cũng có thể lồng các lớp (một lớp trong một lớp). Mục đích của các lớp lồng nhau là để nhóm các lớp thuộc lại với nhau, điều này làm cho mã của bạn dễ đọc và dễ bảo trì hơn.
Để truy cập lớp bên trong, hãy tạo một đối tượng của lớp bên ngoài, sau đó tạo một đối tượng của lớp bên trong:
Thí dụ
class OuterClass {
int x = 10;
class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
// Outputs 15 (5 + 10)
Private Inner Class (Lớp bên trong riêng tư)
Không giống như một lớp “thông thường”, một lớp bên trong có thể là private
hoặc protected
. Nếu bạn không muốn các đối tượng bên ngoài truy cập vào lớp bên trong, hãy khai báo lớp là private
:
Thí dụ
class OuterClass {
int x = 10;
private class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.y + myOuter.x);
}
}
Nếu bạn cố gắng truy cập vào một lớp bên trong riêng tư từ một lớp bên ngoài, một lỗi sẽ xảy ra:Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
Static Inner Class
Một lớp bên trong cũng có thể là static
, có nghĩa là bạn có thể truy cập nó mà không cần tạo một đối tượng của lớp bên ngoài:
Thí dụ
class OuterClass {
int x = 10;
static class InnerClass {
int y = 5;
}
}
public class Main {
public static void main(String[] args) {
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
System.out.println(myInner.y);
}
}
// Outputs 5
Lưu ý: cũng giống như static
các thuộc tính và phương thức, một static
lớp bên trong không có quyền truy cập vào các thành viên của lớp bên ngoài.
Truy cập lớp bên ngoài từ lớp bên trong
Một ưu điểm của các lớp bên trong là chúng có thể truy cập các thuộc tính và phương thức của lớp bên ngoài:
Thí dụ
class OuterClass {
int x = 10;
class InnerClass {
public int myInnerMethod() {
return x;
}
}
}
public class Main {
public static void main(String[] args) {
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = myOuter.new InnerClass();
System.out.println(myInner.myInnerMethod());
}
}
// Outputs 10