欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK8新特性之default、注解、optional

程序员文章站 2022-03-04 11:02:32
...

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());
        }
    }
}