[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