匿名内部类
就是一种特殊的局部内部类;匿名:指的是程序员不需要为这个类声明名字。
使用匿名内部类前:定义实现类,然后继承animal抽象类, 再重写cry()方法。接着new出对象
使用匿名内部类后:从下图Animal.class可以看出匿名内部类确实是Animal的子类。
作用:用于更方便的创建一个子类对象。
匿名内部类的常见使用场景:通常作为一个参数传输给方法。
lambda表达式
Lambda表达式是jdk 8开始新增的一种语法形式;作用:用于简化匿名内部类的代码写法。
lambda表达式: 函数式接口里面只能有一个抽象方法。
什么是函数式接口?有且仅有一个抽象方法的接口。
注意:将来我们见到的大部分函数式接口,上面都可能会有一个@FunctionalInterface的注解,有该注解的接口就必定是函数式解口。
lambda表示式只能简化函数式接口的匿名内部类!!!!
package com.itheima.d6_lambda;
public class LambdaTest1 {
public static void main(String[] args) {
//目标:认识lambda表达式
// Animal a = new Animal(){
// @Override
// public void run() {
// System.out.println("狗跑的贼快...");
// }
// };
// a.run();
// 注意:lambda表达式并不是说能简化所有匿名内部类的写法,只能简化函数式接口的匿名内部类。
// 错误的代码!!!
// Animal a = () -> {
// System.out.println("狗跑的贼快...");
// }
// a.run();
// Swimming s = new Swimming(){
// @Override
// public void swim() {
// System.out.println("学生快乐的游泳...");
// }
// };
// s.swim();
Swimming s = () -> {
System.out.println("学生快乐的游泳...");
};
s.swim();
}
}
interface Swimming{
void swim();
}
abstract class Animal{
public abstract void run();
}
进一步简化lambda表达式的写法: