家人们!上一篇咱们唠了成员内部类和静态内部类,今天必须把局部内部类和匿名内部类这俩 “临时摊位” 给盘明白!尤其是匿名内部类,简直是 Java 里的 “代码压缩大师”,写回调、写接口实现的时候全靠它,看完这篇你再也不用对着它的语法抓耳挠腮了!


三、局部内部类:方法里的 “临时摊位”

局部内部类,就像摆地摊的临时摊位,定义在方法里面,和局部变量是一个级别的。

1. 核心特点:只能在方法里用,出了方法就失效

临时摊位只能在摆摊的时候用,收摊了就没了。所以局部内部类的对象,必须在定义它的方法内部创建,而且要在类定义的后面直接创建,出了方法就用不了了。

java运行

class Outer {
    void method() {
        // 局部内部类:临时摊位
        class Inner {
            void show() {
                System.out.println("我是方法里的局部内部类!");
            }
        }
        // 必须在方法里创建对象,用了就走
        Inner i = new Inner();
        i.show();
    }
}

2. 访问方法里的局部变量:必须是 final 的!

局部内部类的方法里,可以访问定义它的方法里的局部变量,但这个局部变量必须被final修饰!

  • 为啥?因为局部变量在方法执行完就会被销毁,而局部内部类的对象可能还在引用它,为了防止 “对象还活着,变量已经没了” 的情况,必须用final把变量固定住,让它变成常量,就像给临时摊位的东西贴个封条,收摊了也不会消失。
  • 注意:JDK8 及以上版本有语法糖,就算你不写final,只要局部变量被局部内部类访问了,编译器会自动给它加上final,相当于 “偷偷帮你贴了封条”。

四、匿名内部类:一次性的 “快闪摊位”

匿名内部类,是一种特殊的局部内部类,就像快闪摊位,摆一次就没了,连名字都没有,定义和创建对象一步到位!

1. 核心特点:必须继承一个类或者实现一个接口,而且只能创建一个对象

匿名内部类没有名字,定义的时候必须直接继承一个类或者实现一个接口,同时创建对象,相当于 “边搭摊位边摆摊,摆完就拆”。

  • 语法模板(实现接口):

java运行

接口名 引用名 = new 接口名() {
    // 实现接口里的所有抽象方法
    @Override
    public void 方法名() {
        // 方法体
    }
};
  • 举个栗子:实现一个接口的匿名内部类

java运行

interface IA {
    void m1();
}

public class Test {
    public static void main(String[] args) {
        // 匿名内部类:定义接口实现+创建对象,一步到位
        IA ia = new IA() {
            @Override
            public void m1() {
                System.out.println("匿名内部类实现的方法!");
            }
        };
        ia.m1();
    }
}
  • 再举个栗子:继承一个类的匿名内部类

java运行

class MyClass {
    public void method() {
        System.out.println("父类的方法...");
    }
}

public class Test {
    public static void main(String[] args) {
        // 匿名内部类:继承MyClass,重写method方法
        MyClass mc = new MyClass() {
            @Override
            public void method() {
                System.out.println("子类重写后的方法...");
            }
        };
        mc.method();
    }
}

2. 优缺点:代码短了,可读性差点

  • 优点:代码量巨减!不用单独写一个实现类,直接在创建对象的时候把方法实现了,写回调、事件监听的时候特别方便,代码思路一气呵成。
  • 缺点:可读性差!因为没有名字,别人看代码的时候得顺着上下文猜它是啥,写复杂逻辑的时候会让代码变得乱糟糟的。

五、四种内部类总结:四种不同的 “摊位 / 房间”好了家人们!Java 里的四种内部类,从 “公寓单间” 到 “快闪摊位”,全给你扒得明明白白了!再也不用写代码的时候对着内部类的语法抓耳挠腮了!要是还有啥没看懂的地方,评论区唠唠,我给你掰开揉碎了讲明白!

 

更多推荐