您的位置:首页 > 编程语言 > Java开发

Java8 接口的默认方法

2017-10-09 17:17 169 查看

使用方法

方法名前面加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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  重载 java8