Bootstrap

JAVA中的内部类

1、内部类的含义

        顾名思义,JAVA内部类指的就是在一个类的内部又定义一个类。内部类可以访问外部类的成员变量和方法。

2、内部类的分类

2.1 成员内部类

2.1.1 概念

(1)定义在类的内部,但不在方法或代码块中。(2)可以访问外部类的所有成员,包括私有成员。(3)创建成员内部类的对象时,必须先创建外部类的对象。

2.1.2 案例

public class OuterClassA {

    private final int num = 1;

    class InnerClass{

        void showNum(){
            System.out.println(String.format("外部类的num为%s",num));
        }

    }
}

2.2 局部内部类

2.2.1 概念

(1)定义在方法或代码块中。(2)只能在定义它的方法或代码块中使用。(3)可以访问外部类的所有成员以及方法中的局部变量

2.2.2 案例

public class OuterClassB {
    private final int num = 1;

    public void doSomething(){
        class InnerClass{
            void showNum(){
                System.out.println(String.format("外部类的num为%s",num));
            }
        }
        InnerClass innerClass = new InnerClass();
        innerClass.showNum();
    }
}

2.3 匿名内部类

2.3.1 概念

(1)没有名字,通常用于实现接口或继承类,并且只使用一次。(3)创建匿名内部类时不需要显式地声明类名。

2.3.2 案例

public interface OuterClassC {

    void show();

}

2.4 静态内部类

2.4.1 概念

(1)使用 static 关键字修饰,属于外部类的一部分而不是实例的一部分。(2)不依赖于外部类的实例,可以直接通过外部类名访问。(3)不能直接访问外部类的非静态成员,只能访问静态成员。

2.4.2 案例

public class OuterClassD {
    private final static int num = 1;

    static class InnerClass{
        void showNum(){
            System.out.println(String.format("外部类的num为%s",num));
        }
    }
}

2.5 客户端案例:

public class Client {
    public static void main(String[] args) {
        //成员内部类
        OuterClassA outerClass = new OuterClassA();
        OuterClassA.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.showNum();

        //局部内部类
        OuterClassB outerClassB = new OuterClassB();
        outerClassB.doSomething();

        //匿名内部类
        OuterClassC outerClassC = new OuterClassC() {
            @Override
            public void show() {
                System.out.println("匿名内部类");
            }
        };
        outerClassC.show();

        //静态内部类
        OuterClassD.InnerClass innerClass1 = new OuterClassD.InnerClass();
        innerClass1.showNum();
    }
}