zoukankan      html  css  js  c++  java
  • Java 8函数编程轻松入门(三)默认方法详解(default function)

    • default出现的原因

    • Java 8中对API最大的改变在于集合类,Java在持续演进,但是它一直保持着向后兼容。
    • 在Java 8中为Collection接口增加了stream方法,这意味着所有实现Collection接口的类都必须实现stream方法。这时候问题在于:核心自带的类能轻松在JDK实现,但是如果是我们平时自定义的集合类,我们是否需要一个一个的去修改代码?
    • Java 8为了解决这个问题,在Java 8中添加新的语言特性:默认方法
    • 1.默认方法(default)

    • 这时候给Collection接口的stream方法前面加上default。代表:如果实现的Collection的类没有实现stream的子类,就是使用接口的里面的方法。
    • 注意:
    • default的修改的方法是拥有方法体的
    //定义一个函数接口
    @FunctionalInterface
    public interface Speak {
        void say(String msg);
    
        default void haha() {
            System.out.println("hahahaha...");
        }
    }
    
    public class SpeakEnglish implements Speak {
        @Override
        public void say(String msg) {
            System.out.println("How are your!");
        }
    }
    
    
    
    • 1.这时候SpeakEnglish类并没有实现Speak接口的haha方法,依然可以编译通过。
    • 2.SpeakEnglish的实例依然可以调用Speak接口的haha方法,并且可以输出hahaha...
    • 默认方法和子类

    public interface IParent {
        public void message(String msg);
    
        public default void welcome(){
            message("Parent:Hi!");
        }
    }
    
    public interface IChild extends IParent {
        @Override
        default void welcome() {
            message("Child:Hi!");
        }
    }
    
    
    • 那么IChild的实现类的调用的welcome方法是显示什么呢?
    • 答:显示的Child:Hi
    • 原因:类中重写的方法胜出,增加默认方法主要是解决在接口上向后兼容,让类中的重写的方法的优先级高于默认方法能简化很多继承问题
    • 3.多重继承

    • 在我们的认知中,接口是允许多重继承,因此有可能碰到两个接口包含签名相同的默认的方法的情况。这时候我们该怎么解决?
    //手机接口
    public interface IPhone {
        default void communication(){
            System.out.println("使用手机进行通讯...");
        }
    }
    
    //对讲机接口
    public interface IInterphone {
        default void communication(){
            System.out.print("使用对讲机进行通讯...");
        }
    }
    
    //万能手机,既要实现对讲机接口又要实现手机接口
    public class UniversalPhone implements IInterphone,IPhone {
    }
    
    //万能手机,既要实现对讲机接口又要实现手机接口
    public class UniversalPhone implements IInterphone,IPhone {
        @Override
        public void communication() {
            IInterphone.super.communication();
        }
    }
    
    
    • 4.总结

    • 1.类胜于接口。如果在继承链中有方法体或者抽象的方法声明,那么就可以忽略接口的定义的方法
    • 2.子类胜于父类。如果一个接口继承了另一个接口,且两个接口都定义了一个默认方法,那么子类中定义的方法胜出
  • 相关阅读:
    PHP数组(数组正则表达式、数组、预定义数组)
    面向对象。OOP三大特征:封装,继承,多态。 这个讲的是【封存】
    uvalive 3938 "Ray, Pass me the dishes!" 线段树 区间合并
    LA4329 Ping pong 树状数组
    HDU 1257 最少拦截系统
    HDU 1260 Tickets
    codeforce 621D
    codeforce 621C Wet Shark and Flowers
    codeforce 621B Wet Shark and Bishops
    codeforce 621A Wet Shark and Odd and Even
  • 原文地址:https://www.cnblogs.com/strivelearn/p/5995083.html
Copyright © 2011-2022 走看看