内部类的分类:成员内部类、局部内部类

1、成员内部类

修饰符 class Outer {

    修饰符 class INner {
        //
    }

}

注意:内部类使用外部类随意访问,外部类使用内部类要借助内部类对象

使用成员内部类:
a、间接方式:在外部类的方法中使用内部类,main只是调用外部类的方法
b、直接方式:
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()

public class OuterClass {

    private String name = "outer";
    public void methodOuter() {
        int num = 10; // 局部变量
        System.out.println("Outer method");
        System.out.println();
        System.out.println(name);

        class Inner {

            private String name = "inner";// 内外重名
            public void methodInner() {
                System.out.println("INNer method");
                System.out.println(name);// 可以访问外部类的成员变量

                System.out.println(this.name);// 访问内部类成员变量
                System.out.println(OuterClass.this.name);// 访问外部类成员变量
                //内部类如果要访问所在方法的局部变量,那么这个变量必须是final的,或者是事实上是[final]的,也就是不改变的
                System.out.println(num);
            }


        }
    }
}

2、局部内部类:方法里的内部类

上面的class Inner是在方法MethodOuter里的

3、匿名内部类:局部内部类的一种

如果接口的实现类(或者父类的子类)只需要使用一次,那么在这种情况下就可以省略该类的定义,而改为使用【匿名内部类】
匿名内部类的格式:

//接口本来不可以直接new,用于不必为了接口写一个接口的实现类
接口名称 对象名 = new 接口名称 {
    这里是匿名内部类的内容
    在这里面覆盖重写所有的接口抽象方法
    @Override
    public void method1() {
        body
    }
}

注意事项:
a、new 代表创建对象的动作
b、接口名称就是匿名内部类要实现哪个接口
c、匿名内部类在创建对象时只能唯一使用一次,如果希望多次创建对象,并且类的内容是一样的,最好还是写一个该接口的实现类
d、匿名对象在调用方法的时候只能调用一次,如果希望调用多次方法,那就应该为匿名对象起个名字
e、匿名内部类是省略了实现类(子类),匿名对象是省略了对象的名称

原文地址:https://www.cnblogs.com/zhuobo/p/10612789.html