使用方法
方法名前面加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