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);
        }
    };
    
  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/zwscode/p/14284084.html
Copyright © 2011-2022 走看看