在Java开发中,匿名内部类是一种没有名字的局部内部类,它在声明的同时完成实例化。这种写法适合那些只需要使用一次、不需要重复引用的类或接口实现。下面我们来看几个典型的使用场景。

一、事件监听处理
在GUI编程里,比如Swing或Android开发中,经常要给按钮、列表等组件注册监听器。如果每次都新建一个类文件会非常繁琐,使用匿名内部类可以直接在添加监听时写逻辑。
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Demo {
public static void main(String[] args) {
JFrame frame = new JFrame("示例");
JButton btn = new JButton("点击");
// 使用匿名内部类处理按钮点击事件
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
}
});
frame.add(btn);
frame.setSize(200, 100);
frame.setVisible(true);
}
}
二、多线程任务定义
当我们需要快速启动一个线程,且线程逻辑只在此处使用时,可以通过匿名内部类实现Runnable接口或者继承Thread类。
public class ThreadDemo {
public static void main(String[] args) {
// 匿名内部类实现Runnable
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程运行中:" + Thread.currentThread().getName());
}
});
t.start();
}
}
三、集合排序与比较器
在对集合进行排序时,如果排序规则只针对某次操作,可以用匿名内部类提供Comparator实现,避免单独定义比较器类。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("banana");
list.add("apple");
list.add("pear");
// 匿名内部类定义字符串长度比较器
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
System.out.println(list);
}
}
四、回调接口实现
在异步编程或模板方法中,经常需要传入一个回调。匿名内部类可以很方便地写出一次性回调逻辑,比如模拟一个简单的数据加载完成通知。
interface Callback {
void onDone(String result);
}
class Loader {
void load(Callback cb) {
// 模拟加载
cb.onDone("加载完成");
}
}
public class CallbackDemo {
public static void main(String[] args) {
Loader loader = new Loader();
// 匿名内部类作为回调
loader.load(new Callback() {
@Override
public void onDone(String result) {
System.out.println(result);
}
});
}
}
五、使用注意事项
- 匿名内部类没有类名,因此无法定义构造函数,只能使用实例初始化块。
- 它只能继承一个类或实现一个接口,且不能有静态成员(除常量)。
- 在Java 8之后,很多场景可以用lambda表达式替代,代码会更简洁,但匿名内部类在需要多方法接口或兼容旧版本时仍有价值。
匿名内部类本质是简化只使用一次的类定义,理解它的场景能帮助你写出更灵活紧凑的Java代码。