Inner class hiểu đơn giản là một class được khai báo trong một class khác. Trong inner class chúng ta có 4 khái niệm chính:
- Nested Inner class
- Method Local inner class
- Anonymous inner class
- Static nested classs
Nested inner class
Nested inner class có thể truy cập bất cứ thành viên nào của class chứa nó, kể cả private. Giống như các thành viên khác của nested inner class cũng có thể có access modifier.
Ví dụ
class Outer { // default access modifier class DefaultInner { public void show() { System.out.println("DefaultInner"); } } public class PublicDefaultInner { public void show() { System.out.println("PublicDefaultInner"); } } } class Main { public static void main(String[] args) { Outer.DefaultInner defaultInner = new Outer().new DefaultInner(); defaultInner.show(); Outer.PublicDefaultInner publicDefaultInner = new Outer().new PublicDefaultInner(); publicDefaultInner.show(); } }
Output:
DefaultInner
PublicDefaultInner
Note: Inner class không thể chứa các thành viên staticnhư static method, biến static etc vì bản thân một Inner class là một thành viên của class chứa nó và chúng có mối liên kết với nhau vì vậy nên nó sẽ không thể có các thành phần static.
Ví dụ
class Outer { public class PublicDefaultInner { public static void show() { System.out.println("PublicDefaultInner"); } } } class Main { public static void main(String[] args) { Outer.PublicDefaultInner publicDefaultInner = new Outer().new PublicDefaultInner(); publicDefaultInner.show(); } }
Output:
Error:(4, 28) java: Illegal static declaration in inner class Outer.PublicDefaultInner
modifier ‘static’ is only allowed in constant variable declarations
Method local inner class
Chúng ta có thể khai báo một inner class bên trong một method của một outer class như sau
class Outer { void outerMethod() { System.out.println("inside outerMethod"); class Inner { void innerMethod() { System.out.println("inner method "); } } // Khoi tao Inner class ben trong outer method Inner y = new Inner(); y.innerMethod(); } } class MethodDemo { public static void main(String[] args) { Outer x = new Outer(); x.outerMethod(); } }
Output:
inside outerMethod
inner method
Method local inner class có thể truy cập các biến của class chứa nó hoặc là method chứa nó.
class Outer { private String str = "share"; void outerMethod() { int x = 98; System.out.println("inside outerMethod"); class Inner { void innerMethod() { System.out.println("x= "+x); System.out.println("str = " + str); } } Inner y = new Inner(); y.innerMethod(); } } class MethodLocalVariableDemo { public static void main(String[] args) { Outer x = new Outer(); x.outerMethod(); } }
Output
inside outerMethod
x= 98
str = share
Static nested class
Static nested class không phải là một inner class, chúng được sử dụng như là một thành viên của class chứa nó.
class Outer { private static void outerMethod() { System.out.println("inside outerMethod"); } // A static inner class static class Inner { public static void main(String[] args) { System.out.println("inside inner class Method"); outerMethod(); } } }
Output
inside inner class Method
inside outerMethod
Anonymous inner class
Anonymous inner class là một inner class được khai báo mà không có tên.
Chúng ta có một class Shape là một interface có hàm formulaArea().
Hàm printFormula() sẽ in ra các công thức tính diện tích của các hình Rectangle và Circle.
Trong hàm printFormula() mình sẽ làm 2 class đại diện cho 2 hình là Rectangle và Circle trong đó Rectangle được viết theo local class và Circle sẽ viết theo anonymous class. Xem code dưới đây
public class Main { public interface Shape { void formulaArea(); } public static void printFormula() { // Local class class Rectangle implements Shape { @Override public void formulaArea() { System.out.println("A * B"); } } Rectangle rectangle = new Rectangle(); rectangle.formulaArea(); // -------------------------------------------------- //Anonymous class Shape cricle = new Shape() { @Override public void formulaArea() { System.out.println("R * R * 3.14"); } }; cricle.formulaArea(); } public static void main(String[] args) { printFormula(); } }
Output
A * B
R * R * 3.14
Nguồn tham khảo