java匿名函数的作用是什么?

java为什么要引入匿名类?匿名类解决什么问题?如果不用匿名类,我们会遇到什么问题?
关注者
6
被浏览
14,575

5 个回答

在只关注功能,不关注类型名字的场合,就可以使用匿名类。

下面举个形象的例子说明匿名类的作用。

Java类的方法的参数只能是基本类型或引用类型的变量,却不能是一个方法。例如以下画笔Pen类有一个draw()方法,具有画画的功能。到底要画什么图形,由客户程序提供的paint()方法决定。draw()方法会调用paint()方法:

public class Pen{
  public void draw( paint() ){      //非法
    paint();
}

很可惜,以上代码是非法的,Java语言不允许把一个方法作为另一个方法的参数。为了把paint()方法传递给draw()方法,需要定义一个Action类,它有一个paint()方法,然后把一个Action实例的引用传给draw()方法。

public class Action{
  public void paint(){
    System.out.println("一朵花");
public class Pen{
  public void draw( Action action ){      
    action.paint();
}

如果paint()方法的行为千变万化,有的客户程序会画一栋楼,有的客户程序会画一匹马,有的客户程序会画一座山。就需要定义许多Action子类:

public class Action1 extends Action{
  public void paint(){
    System.out.println("一栋楼");
public class Action2 extends Action{
  public void paint(){
    System.out.println("一匹马");
public class Action3 extends Action{
  public void paint(){
    System.out.println("一座山");
……

上述方式尽管是可行的,但是会使得程序代码很冗长。这些Action子类仅仅用来提供特定的绘画行为,更直白地说,只是为了提供一段程序代码。在这种情况下,这些Action子类到底叫什么名字并不重要,不妨用匿名类来替代Action1、Action2、Action3等子类,就会简化程序代码。

在客户程序中,通过Action类的匿名子类来提供特定的绘画行为:

public static void main(String[] args){
    Pen pen=new Pen();
    pen.draw( new Action(){           //画一栋楼的匿名类
      public void paint(){
        System.out.println("一栋楼");
    pen.draw( new Action(){           //画一匹马的匿名类
      public void paint(){
        System.out.println("一匹马");
    pen.draw( new Action(){           //画一座山的匿名类
      public void paint(){
        System.out.println("一座山");
  }

上文参考孙卫琴的 经典Java书籍《漫画Java编程》