Java8 接口的默认方法

来源:互联网 发布:吹笛子软件安卓版 编辑:程序博客网 时间:2024/05/27 21:49

使用方法

方法名前面加default关键字

public interface Lived {    default String getDescription() {        return "有生命的";    }}

接口的静态方法

java8中允许接口中定义静态方法

public interface Lived {    static boolean instanceOf(Object obj) {        return obj instanceof Lived;    }}

继承问题

  • 如果有多个重载的方法,先按照重载规则来选取
    • 最精确原则:选取类型匹配,且在继承树最靠近叶子节点的类型
  • 如果选定的方法,有多个重写的版本(签名完全相同),则按照下面规则选取
    • 一个声明在类里面的方法优先于任何默认方法(classes always win)
    • 优先选取最具体的实现( 继承树的最靠近叶子节点)
  • 多重继承
    • 如果某个方法存在“菱形继承”,必须显式重写
    • 新语法:用某个接口的默认实现
        return Lived.super.getDescription();

重载相关的问题

最精确原则

package com.javapapaer.java;public class NullArguementOverloading {    public static void main(String[] args) {        NullArguementOverloading obj = new NullArguementOverloading();        obj.overLoad(null);    }    private void overLoad(Object o){        System.out.println("Object o arguement method.");    }    private void overLoad(double[] dArray){        System.out.println("Double array argument method.");    }    private void overLoad(String str) {        System.out.println("String argument method.");    }}

main函数obj.overLoad(null)那一行会编译报错。String的 overLoad和double[]的overLoad都可以匹配,但是两者在继承属上是平行的,因此编译器也不知道到底该调用哪一个重载方法。

重载是编译期的行为,与多态无关

import java.util.ArrayList;import java.util.List;public class OverridePuzzle {    private void overloadList(List list){        System.out.println("List arguement method.");    }    private void overloadList(ArrayList arrayList){        System.out.println("ArrayList arguement method");    }    public static void main(String[] args) {        OverridePuzzle op = new OverridePuzzle();        List list = new ArrayList<String>();        op.overloadList(list);    }}

程序输出:List arguement method

参考:Java8学习之默认方法
参考:Java 重写(Override)与重载(Overload)
参考:深入理解重载和重写及与之相关的多态性 Overloading and Overriding

原创粉丝点击