JDK8新特性之default、注解、optional
程序员文章站
2022-03-04 11:02:32
...
JDK8新特性之default、注解、optional
1 接口的 default 方法
接口中方法默认使用public abstract修饰, 接口中字段默认使用public static final修饰.
在 JDK8 中对接口进行增强, 可以定义 default 修饰的方法,也可以定义static修饰的方法
default修饰的方法和static 修饰的方法主要用于接口功能增强时,如果接口已经定义完成,并且也有若干的实现类实现了该接口.根据业务需求,需要在接口中再增强其他的功能, 后面增强的功能可以使用default修饰. 之前定义好的实现类就不需要再进行修改
public interface MyInterface {
//默认的抽象方法, 需要在实现类中重写 public abstract
void m1();
//字段默认 public stati cfinal修饰
int XX = 121;
//如果方法使用default 修饰, 表示该方法可以有默认的方法体,在实现类中可以重写,也可以不重写
default void dm() {
System.out.println("接口中使用default修饰的方法");
}
//静态方法
static void sm(){
System.out.println("接口中可以使用static定义静态方法");
}
}
public class MyClass implements MyInterface {
@Override
public void m1() {
System.out.println("在实现类中重写接口中的抽象方法");
}
}
public class MyClass2 implements MyInterface {
@Override
public void m1() {
System.out.println("在实现类中重写接口中的抽象方法");
}
@Override
public void dm() {
System.out.println("在实现类中重写接口中default修饰的方法");
}
}
public class Test01 {
public static void main(String[] args) {
MyInterface mi = new MyClass();
mi.dm();
MyInterface mi2 = new MyClass2();
mi2.dm();
//调用接口的静态方法
MyInterface.sm();
}
}
2 扩展注解支持
2.1 增加FunctionalInterface注解
//注解声明接口为函数式接口
@FunctionalInterface
public interface MyFuncationInterFace {
void m1();
default void dm(){
System.out.println("default修饰的方法有默认方法体");
}
}
public class Test01 {
public static void main(String[] args) {
//接口赋值匿名内部类对象
MyFuncationInterFace mi2 = new MyFuncationInterFace() {
@Override
public void m1() {
System.out.println("在匿名内部类中重写接口的抽象方法");
}
};
//执行匿名内部类对象的方法
mi2.m1();
//MyInteface2接口声明为了函数式接口,可以直接给接口引用赋值Labmda表达式
mi2 = () -> System.out.println("给接口引用赋值 Lambda表达式");
mi2.m1();
}
}
2.2 对元注解的增强
JDK8扩展了注解的使用范围,在ElementType枚举类型中增强了两 个枚举值:
ElementType.PARAMETER,表示注解能写在类型变量的声明语句中
ElementType.USE, 表示注解能写在使用类型的任何语句中(结合第三方插件可在编译期可以检测出运行时异常,如空指针、越界等)
2.3 增加Repeatable 元注解
增加了 Repeatable 元注解.JDK8 前的版本中,同一个注解在同一个 位置只能使用一次,不能使用多次. 在JDK8中引入了重复注解,表示一 个注解在同一个位置可以重复使用多次
/**
* *自定义可重复的注解
*/
@Repeatable(RoleAnnotions.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface MyAnnotation{
//定义角色属性
String role();
}
/**
* 定义一个容器,可以包含若干的 MyAnnotation 注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface RoleAnnotions {
MyAnnotation[] value();
}
/**
* 使用重复注解修饰一个类
*/
@MyAnnotation(role="Husband")
@MyAnnotation(role="Son")
@MyAnnotation(role="Father")
public class Person{
}
/**
* 通过反射读取可重复注解的信息
*/
public class Test02 {
public static void main(String[] args) {
//创建 Class 对象
Class<?> claxx = Person.class;
//获得指定的自定义注解
MyAnnotation[] myAnnotations = claxx.getDeclaredAnnotationsByType(MyAnnotation.class);
//遍历数组,打印角色属性
for (MyAnnotation annotation : myAnnotations) {
System.out.println(annotation.role());
}
}
}