[java] 匿名类

匿名类

  • 匿名类是一种特殊的内部类
  • 它没有类名,在定义类的同时就生成该对象的一个实例
  • 一次性使用的类
    class Outer
    {
    private int size = 5;
    public Object makeTheInner(int localVar)
    {
      final int finalLocalVar = 99;
      return new Object(){
        public String toString(){
          return ("InnerSize:" + size + "finalLocalVar:" + finalLocalVar);
        }
      };
    }
    }
    

    匿名类的使用

  • 不取名字,直接用其父类或接口的名字。
    也就是说,该类是父类的子类,或者实现了一个接口 编译器生成xxxxx$1之类的名字
  • 类的定义的同时就创建实例,即类的定义前面有一个new
    new类名或接口名(){……}
    不使用关键词class,也不使用extends及implements
  • 在构造对象时使用父类构造方法
    不能够定义构造方法,因为它没有名字 如果new对象时,要带参数,则使用父类的构造方法

匿名类的应用

  • 用到界面的事件处理
    //SymAction ISymAction = new SymAction();
    //btnNew.addActionListener(ISymAction);
    btnNew.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent event){
      btnNew_ActionPerformed(event);
    }
    });
    
  • 作为方法的参数
    Arrays.<Book>sort(books, new Comparator<Book>(){
    public int compare(Book b1, Book b2){
      return b1.getPrice() - b2.getPrice();
    }
    });
    

Lambda表达式

  • 基本写法
    (参数) -> 结果
    (String s) -> s.length()
    x -> x*x
    () -> {System.out.println("aaa");}

  • 在Java中它实际上是“匿名类的一个实例”
  • Lambda表达式是接口或者说是接口函数的简写
interface Fun{double fun(double x);}
double d = Integral(new Fun(){
    public double fun(double x){
        return Math.sin(x);
    }
}, 0, Math.PI, 1e-5);

使用Lambda表达式简化后:

double d = Integral(x -> Math.sin(x), 0, Math.PI, 1e-5);
  • 按钮事件处理
    btn.addActionListener(e -> {...});
    
  • 由于Lambda只能表示一个函数,所以能写成Lambda的接口要求包含且最多只能有一个抽象函数
  • 这样的接口可以(但不强求)用标记
    @FunctionalInterface
    interface Fun{double fun(double x);}
    
  • 来表示,称为函数式接口
Written on December 3, 2022