JDK新特性
一.Lambda表达式
1.体验Lambda表达式
需求:启动一个线程,在控制台输出一句话:多线程程序启动了
方式1:
●定义一个类MyRunnable实现Runnable接口, 写run()方法
●创建MyRunnable类的对象
●创建Thread类的对象,把MyRunnable的对象作为构造参数传递
●启动线程
方式2:
●匿名内部类的方式改进
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(“多线程程序启动了“);
}
}).start();
方法形式参数为空,说明调用方法时不需要传递参数。
方法返回值类型位void时,说明方法执行没有结果返回。
方法体中的内容,是我们具体要做的事。
方式3:
●Lambda表达式的方式改进
new Thread(()-> {
System.out.println("多线程程序启动了“);
}).start();
() :里面没有内容,可以看成是方法形式参数为空。
->:用箭头指向后面要做的事。
{ }:包含一段代码,称之为代码块,可以看成是方法体中的内容。
组成Lambda表达式的三要素:形式参数,箭头,代码块。
Lambda表达式的格式
●格式: (形式参数)-> {代码块}
●形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可
●->:由英文中画线和大于符号组成,固定写法。代表指向动作
●代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
Llambda表达式的使用前提:
有一个接口;
接口中有且只有一个抽象方法。
2. Lambda表达式的省略模式
省略规则:
●参数类型可省略。 但是有多个参数的情况下,不能只省略一个
●如果参数有且仅有一个,那么小括号可以省略
●如果代码块的语句只有一条,可以省略大括号和分号,甚至是return。
3. Lambda表达式的注意事项
注意事项:
●使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法
●必须有上下文环境,能推出Lambda对应的接口
根据局部变量的赋值得知Lambda对应的接口: Runnable r= () -> System.out.println("Lambda表达式");
根据调用方法的参数得知Lambda对应的接口: new Thread(() -> System.out.println("Lambda表达式").start();
4. Lambda表达式和匿名内部类的区别
所需类型不同:
●匿名内部类:可以是接口,也可以是抽象类可以具体类
●Lambda表达式:只能是接口
使用限制不同:
●如果接口中有仅有一个抽象方法,可以用Lambda表达式,可以使用匿名内部类
●如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
实现原理不同:
●匿名内部类: 编译之后,产生一个单独的.class字节码文件。
●Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码在运行的时候动态生成。
二.接口新特性
1.接口组成更新概述
接口的组成:
●常量
public static final
●抽象方法
public abstract
●默认方法(Java 8)
●静态方法(Java 8)
●私有方法(Java9)
2.接口中默认方法
接口中默认方法的定义格式:
●格式: public default 返回值类型 方法名(参数列表){ }
●范例: public default void show3(){ }
接口中默认方法的注意事项:
●默认方法不是抽象方法, 所以不强制被重写。但是可以被重写,写的时候去掉default关键字
●public可以省略, default不能省略
3.接口中静态方法
接口中静态方法的定义格式:
●格式: public static 返回值类型 方法名(参数列表){ }
●范例: public static void show() { }
接口中静态方法的注意事项:
●静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
●public可以省略, static不能省略
4.接口中私有方法
接口中私有方法的定义格式:
●格式1: private 返回值类型 方法名(参数列表){ }
●范例1: private void show(){ }
●格式2: private static 返回类型 方法名名(参数列表){ }
●范例2: private static void method(){ }
接口中私有方法的注意事项:
●默认方法可以调用私有的静态方法和非静态方法
●静态方法只能调用私有的静态方法