Các lớp bên trong Java
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 về 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:
Ví 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)
Lớp học nội tâm riêng tư
Không giống như lớp "thông thường", lớp bên trong có thể ở 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
:
Ví 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 một lớp bên trong riêng tư từ một lớp bên ngoài thì sẽ xảy ra lỗi:
Main.java:13: error: OuterClass.InnerClass has private access in OuterClass
OuterClass.InnerClass myInner = myOuter.new InnerClass();
^
Lớp bên trong tĩnh
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 đối tượng của lớp bên ngoài:
Ví 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 ý: giống như các thuộc tính và phương thức static
, lớp bên trong static
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 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:
Ví 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