LOADING

加载过慢请开启缓存 浏览器默认开启

Jdk1.8新增特性

2023/4/9 Java Java

匿名内部类

概述:匿名内部类本质上还是一个特殊的局部内部类(定义在方法内部)

前提:需要一个接口或类

格式:

1
2
3
new 类名/接口(){

}

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class javatest {
public static void main(String[] args) {
useInter(new Inter() {
@Override
public void show() {
System.out.println("---show---");
}
});
}
public static void useInter(Inter i){
i.show();
}
interface Inter{
void show();
}
}

匿名内部类可以使代码更加简洁,定义一个类的同时对其进行实例化

Lambda表达式

Lambda概述

.Lambda表达式是Jdk8开始后的一种新语法形式。

.作用:简化匿名内部类的代码写法。

Lambda表达式的简化格式

1
2
3
4
5
6
7
8
9
10
11
()->{}
(匿名内部类被重写方法的形参列表)->{
被重写方法的方法体代码
}
注:->是语法形式,无实际含义
():匿名内部类被重写方法的形参列表
{}:被重写方法的方法体代码
Lambda表达式,只允许操作函数式编程接口
什么是函数式接口?
.首先必须是接口、其次接口中的有且仅有一个抽象方法的形式
.通常我们会在接口上加上一个@FunctionalInterface注解,标记该接口必须是满足函数式接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class javatest {
public static void main(String[] args) {
useInter(new Inter() {
@Override
public void show() {
System.out.println("---匿名内部类---show---");
}
});
System.out.println("-----------");
useInter(()->{
System.out.println("---Lambda表达式---show---");
});
}
public static void useInter(Inter i){
i.show();
}
interface Inter{
void show();
}
}

Lambda表达式的省略写法

.参数类型可以省略不写。

.如果只有一个参数,参数类型可以省略不写,同时()也可以省略。

.如果Lambda表达式的方法体代码只有一行代码

​ 可以省略大括号不写,同时要省略分号

​ 此时,如果这行代码是return语句,必须省略return不写,同时也必须省略 “:”不写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class test2 {
public static void main(String[] args) {
UseInter(()->
null
);
}
public static void UseInter(InterA interA){
String show = interA.show();
System.out.println(show);
}
interface InterA{
String show();
}
}

Lambda表达式和匿名内部类的区别

使用限制不同

.匿名内部类:可以操作类、接口

.Lambda表达式:只能操作函数式接口

实现原理不同

.匿名内部类:编译之后,产生一个单独的.class字节码文件

.Lambda表达式:编译之后,没有一个单独的.class字节码文件