17、说出lambda表达式和匿名内部类的联系和区别,
相同点:
(1)被lambda和匿名内部类访问的局部变量都会隐式的被final修饰,也就是会变成“effectively final”局部变量,
(2)lambda表达式和匿名内部类都可以直接调用接口中继承的默认方法。
不同点:
(1)匿名内部类可以为任意接口创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可;但是lambda表达式只能为函数式接口创建实例
(2)匿名内部类可以为抽象类,甚至是普通类创建实例,但lambda表达式只能为函数式接口创建实例。
(3)匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法,但Lambda表达式的代码块不允许调用接口中定义的默认方法。确实。
局部变量只要一进入到匿名内部类方法代码块中就已经不能再改变了,就算在外面没有被初始化,也不能赋值。也就是说如果在外部没有显式初始化,而匿名内部类连出现都不能出现。lambda表达式也一样。
只有在只有一个形参的时候才能省略括号,参数为空的话要写一个空括号。只有一条语句的时候,可以省略花括号,return也可以省去
如果lambda实现非函数式接口,那么会报错
只有接口中,才会默认装上public abstract修饰,抽象类没有,只有接口才有default方法,抽象类没有