Inner class trong java với ví dụ cụ thể

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 RectangleCircle
Trong hàm printFormula() mình sẽ làm 2 class đại diện cho 2 hình là RectangleCircle trong đó Rectangle được viết theo local classCircle 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

https://www.geeksforgeeks.org/inner-class-java/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x