JAVA中内部类和匿名内部类的区别,分别在什么时候使用它们?

本文详细解析了JAVA内部类与匿名内部类的区别及其使用场景,内部类适合用于事件监听器的实现,能够方便地访问外部类的成员变量和方法。而匿名内部类适用于仅需使用一次的情况,有助于减少资源开销。

今天没事,抽出时间总结了一下很多开发人员都想弄明白的一些JAVA基础知识(内部类和匿名内部类)。

一、JAVA中内部类和匿名内部类的区别

         内部类内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用。

        匿名内部类:它只能使用一次,不区分static和非static。如果用到外部类的变量的话,必须是类变量或者实例变量,就是必须是类定义的变量,或者final的局部变量。匿名内部类如果是继承某个类的话是可以重写那个类的方法的,这个和普通内部类一样。

        总结:可以用匿名内部类的地方都可以用内部类替换,但是用匿名内部类编码非常简洁,也容易读懂,除非你需要多次使用那个内部类,不然建议还是使用匿名内部类。

二、内部类的使用时机

      1、实现事件监听器的时候(比方说actionListener 。。。采用内部类很容易实现);

      2、编写事件驱动时(内部类的对象可以访问外部类的成员方法和变量,注意包括私有成员);

      3、在能实现功能的情况下,为了节省编译后产生的字节码(内部类可以减少字节码文件,即java文件编译后的.class文件);

 

三、匿名内部类的使用时机

       匿名内部类是内部类的一种特殊情况。它只有一个实例,而且没有引用。所以,一般在能用内部类实现,但是实例只用一次的情况下使用它(可以减少资源开销);

以上是本人通过几年的开发经验总结的。希望能对您一些JAVA初学者有所帮助。如果有什么不足或不对的地方,还请高手们指点。

 

 

 

Java 中的 **Lambda 表达式** **匿名内部类(Anonymous Inner Class)** 都可以用于实现接口或抽象类的实例,特别是在实现只包含一个抽象方法的接口时。但它们在实现机制、语法、语义性能等方面存在显著差异。 --- ### ✅ 主要区别如下: | 特性 | Lambda 表达式 | 匿名内部类 | |------|----------------|-------------| | **语法** | 简洁,使用 `->` 语法 | 冗长,使用 `new Interface() { ... }` | | **this 关键字指向** | 指向**外部类的 this** | 指向**自身新创建的类实例** | | **生成的类文件** | 不会生成单独的 `.class` 文件(使用 `invokedynamic`) | 会生成一个独立的类文件(如 `Main$1.class`) | | **适用接口** | 只能用于**函数式接口**(只有一个抽象方法) | 可用于**任意接口或抽象类** | | **变量捕获** | 不可修改外部变量(变量必须是 final 或等效不可变的) | 可以访问外部变量,但不能修改(Java 8+) | | **性能** | 通常性能更好(更轻量) | 相对更重(生成新类) | | **使用场景** | 推荐用于函数式编程、Stream API、简洁回调 | 适用于需要复杂逻辑或多方法实现的场景 | --- ### ✅ 示例对比: #### 使用匿名内部类: ```java new Thread(new Runnable() { @Override public void run() { System.out.println("Hello from Anonymous Inner Class"); } }).start(); ``` #### 使用 Lambda 表达式: ```java new Thread(() -> System.out.println("Hello from Lambda")).start(); ``` --- ### ✅ Lambda 表达式的局限性: - 仅适用于**函数式接口** - 不适合复杂的多方法实现逻辑 - 不能定义变量或构造函数 --- ### ✅ 何时选择 Lambda 表达式? - 接口是函数式接口 - 逻辑简单、一行代码即可完成 - 需要与 Stream API、Optional 等现代 Java 特性配合使用 --- ### ✅ 何时选择匿名内部类? - 接口或类有多个抽象方法 - 需要定义成员变量或构造函数 - 需要更复杂的逻辑实现 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值