lambda表达式和匿名内部类的比较

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,抽象类)