lambda表达式和匿名内部类
【Lambda表达式与匿名内部类的 区别】
1.匿名内部类可以为任意接口创建实例——不管有多少个抽象方法,只要匿名内部类实现了所有方法即可。
但是Lambda表达式只能为函数式接口内创建实例。
2.匿名内部类可以为抽象类甚至普通类创创建实例,
但lambda表达式只能为函数式接口创建实例。
3.匿名内部类实现的抽象方法体允许调用接口中的默认方法,
但Lambda表达式的代码块不允许调用接口中的默认方法。
【Lambda表达式与匿名内部类的 相同点】
1.Lambda表达式和匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量(包括实例变量和类变量)
2.Lambda表达式创建的对象和匿名内部类创建的对象一样,都可以直接调用从接口中继承的默认方法。
普通两个类:
public class TimeTest {
public static void main(String[] args) {
ActionListener listener = new TimerPrinter();
Timer t = new Timer(1000,listener);
t.start();
JOptionPane.showMessageDialog(null,"quit progrom?");
System.exit(0);
}
}
class TimerPrinter implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
Date now = new Date();
System.out.println("the time is "+now);
Toolkit.getDefaultToolkit().beep();
}
}
lambda表达式
public class Lambuda {
public static void main(String[] args) {
Timer t = new Timer(1000,listener ->{
Date now = new Date();
System.out.println("the time is "+now);
Toolkit.getDefaultToolkit().beep();
});
t.start();
JOptionPane.showMessageDialog(null,"quit progrom?");
System.exit(0);
}
}
匿名内部类
public class InnerClass {
public static void main(String[] args) {
ActionListener listener = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
Date now = new Date();
System.out.println("the time is "+now);
Toolkit.getDefaultToolkit().beep();
}
};
Timer t = new Timer(1000,listener);
t.start();
JOptionPane.showMessageDialog(null,"quit progrom?");
System.exit(0);
}
}
Lambda与匿名内部类对比
本文深入探讨了Java中Lambda表达式与匿名内部类的区别与联系。Lambda表达式仅适用于函数式接口,而匿名内部类则能实现任意接口或继承抽象类。两者均可访问effectively final的局部变量及外部类成员,且创建的对象均能调用接口默认方法。
1182

被折叠的 条评论
为什么被折叠?



