以例题方式讲解,如图所示:
Animal抽象类
package Demo;
public abstract class Animal {
public abstract void method();
}
Person接口
package Demo;
public interface Person {
void swimings();
}
Robot具体类
package Demo;
public class Robot {
public void look(){
System.out.println("看书");
}
}
Lambda测试类如下:
一. 所需类型不同
- 匿名内部内:可以使接口,也可以是抽象类,可以是具体类
- Lambda表达式:只能是接口
代码:
package Demo;
public class LambdaDemo {
public static void main(String[] args) {
//所需类型不同
//匿名内部内:可以使接口,也可以是抽象类,可以是具体类
useAnimal(new Animal() {
@Override
public void method() {
System.out.println("抽象类:鸡哥练篮球");
}
});
usePerson(new Person() {
@Override
public void swimings() {
System.out.println("接口:ikun在游泳");
}
});
useRobot(new Robot(){
@Override
public void look() {
System.out.println("具体类:机器人看书");
}
});
//Lambda表达式:只能是接口
//useAnimal(()-> System.out.println("抽象类:鸡哥练篮球"));不能用
//useRobot(()->System.out.println("具体类:机器人看书"));不能用
usePerson(()->System.out.println("接口:ikun在游泳"));
}
public static void useAnimal(Animal a){
a.method();
}
public static void usePerson(Person p){
p.swimings();
}
public static void useRobot(Robot r){
r.look();
}
}
注意:
二. 使用限制不同
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
代码:
package Demo;
public class LambdaDemo {
public static void main(String[] args) {
//使用限制不同
//如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
usePerson(new Person() {
@Override
public void swimings() {
System.out.println("接口:ikun在游泳");
}
@Override
public void eat() {
System.out.println("接口:ikun在吃饭");
}
});
//usePerson(()-> System.out.println(""));
}
public static void usePerson (Person p){
p.swimings();
}
}
原因:
三. 实现原理不同
- 匿名内部类:编译之后,产生一个单独的class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码在运行的时候动态生成
代码:
package Demo;
public class LambdaDemo {
public static void main(String[] args) {
//实现原理不同
//匿名内部类:编译之后,产生一个单独的class字节码文件
usePerson(new Person() {
@Override
public void swimings() {
System.out.println("接口:ikun在游泳");
}
});
//Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码在运行的时候动态生成
//usePerson(()-> System.out.println("接口:ikun在游泳"));
}
public static void usePerson(Person p){
p.swimings();
}
}
原因: