zoukankan      html  css  js  c++  java
  • Java8新特性之接口

    一、接口中的默认方法

    interface Test {
        //java8接口中允许有默认方法的存在,子类实现接口
        //可以不用重写默认方法,如果有需要也可以进行重写
        default void show() {
            System.out.println("hello");
        }
    }
    class ClassTest01 implements Test {
        @Override
        public void show() {
            //调用接口中的默认方法,需要使用这种方式
            //如果是通过继承的方式则使用 super.show()
            Test.super.show();
        }
        public static void main(String[] args) {
            ClassTest01 classTest01 = new ClassTest01();
            classTest01.show();
        }
    }
    

    在Java8中,允许在接口中实现默认方法,默认方法实现类可以不用重写。在实际开发过程中,一个接口可能有多个实现类,这些实现类每个都得实现接口的所有方法,使用起来很不方便,默认方法的引入可以减少代码冗余,提高开发效率。当然,我们也要注意不能滥用默认方法。

    1.默认方法的一般形式

    default void show() {
        System.out.println("hello");
    }
    

    默认方法使用default关键字进行修饰。

    2.在实现类中使用默认方法

    2.1 重写

     @Override
    public void show() {
         //调用接口中的默认方法,需要使用这种方式
         //如果是通过继承的方式则使用 super.show()
         Test.super.show();
    }
    

    如果有重写的需要,可以对方法进行重写,如果在重写方法中调用接口中的默认方法,需要使用Test.super.show()的形式。Test是接口名,super是Java关键字,show是接口中的默认方法。

    2.2 直接使用

    如果不需要对默认方法重写,则可以直接使用接口中的默认方法。

    二、接口中的静态方法

    在Java8中,接口也可以有静态方法。

    1.使用

    interface Test {
        //这是接口中的静态方法
        static void show02(){
            System.out.println("我是接口中的静态方法");
        }
    }
    

    在接口中定义静态方法和在普通类中定义静态方法没有太大的区别,但是使用上有区别。

    不论是接口中的静态方法,还是普通类中的静态方法,他们都是无法实现多态的,子类/实现类中无法继承/实现静态方法。

    在使用时,普通类的实例可以调用静态方法,而接口中的静态方法只能通过接口名进行调用。

    三、函数式接口

    函数式接口是Java8提供的一组特殊接口,通过函数式接口,我们可以配合lambad表达式和Stream流减少代码开发的难度。

    1.函数式接口的一般形式

    @FunctionalInterface
    public interface Consumer<T> {
        
        void accept(T t);
    
        default Consumer<T> andThen(Consumer<? super T> after) {
            Objects.requireNonNull(after);
            return (T t) -> { accept(t); after.accept(t); };
        }
    }
    
    • 函数式接口一般使用@FunctionalInterface注解进行标注,表示该接口为函数式接口
    • 函数式接口中只允许有一个抽象方法,但是可以有多个默认方法
    • @FunctionalInterface注解也可以不加,但是必须确保里面只有一个抽象方法

    2.常用的函数式接口类型

    2.1 消费型

    Consumer<String> consumer = new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    };
    consumer.accept("hello world!");
    

    消费型是指接口中的方法只接受参数,没有返回值

    2.2 判定型

    Predicate<String> predicate = new Predicate<String>() {
        List<String> list = Arrays.asList("A","B","C");
        @Override
        public boolean test(String s) {
            return list.contains(s);
        }
    };
    System.out.println(predicate.test("A"));
    

    判定型返回布尔值,用来进行一些判定操作。

    2.3 供给型

    Supplier<Object> supplier = new Supplier<Object>() {
        @Override
        public Object get() {
            return new Object();
        }
    };
    

    供给型用来输出值,类似一个工厂,一直生产对象,提供给外界。

    2.4 函数式

    Function<String,Integer> function = new Function<String, Integer>() {
        @Override
        public Integer apply(String s) {
            return Integer.parseInt(s);
        }
    };
    
  • 相关阅读:
    error C2065: “SHCNE_DELETE”: 未声明的标识符
    error C2872: ‘ofstream’ : ambiguous symbol
    error C2065: ‘__in’ : undeclared identifier
    LINK : fatal error LNK1561: 必须定义入口点
    VS2010提示error TRK0002: Failed to execute command
    js怎么获取一个单位为rem的元素真实宽/高度?
    将时间转化为几秒前 几分钟前 几小时前...
    uni-app picker 组件实现二级联动?
    uni-app scroll-view 点击实现元素居中?
    初始化CSS样式
  • 原文地址:https://www.cnblogs.com/zwscode/p/14284084.html
Copyright © 2011-2022 走看看