默认方法
可以为接口提供一个默认实现,使接口方法含有方法体(内容)。在方法前面加上default 关键字实现。
public interface Comparable<T>
{
default int compareTo(T others){return 0;}
}
实现该接口的类,默认方法可以不用重写(不是抽象的)。不过大部分情况下,需要覆盖默认方法实现其他的功能。
默认方法可以调用其他方法。例如:
public interface Collection
{
int size();// an abstract method
default boolean isEmpty(){return size()==0;}
}
默认方法的一个重要用法是“接口演化”。
例如:
public class Bag implements Collection
在java 8后,Collection接口增加了一个stream 方法。
如果stream 方法不是默认方法,那么Bag无法编译(没实现stream方法)。
因此,使用默认方法可以使程序运行并调用Collection.stream方法。
解决默认方法的冲突
如果先在一个接口中定义了一个默认方法,然后在父类或另一个接口定义了同样方法(签名一样)。
会实现哪个方法?
1.超类优先。
public interface hello
{
default void hello(){System.out.println("hello");}
}
class person
{
public void hello(){System.out.println("hello,world");}、、
}
class student extends person implements hello
{
}
父类优先,默认方法会被忽略。
//默认方法只存在接口中哦。😊
2.接口冲突
如果一个接口提供了默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方法,必须覆盖这个方法来解决问题。
例如:
interface Person
{
default String getName(){return "";};
}
interface Named
{
default String getName(){return getClass().getName()+"-"+hashCode();}
}
class Student implements Person,Named{....}
之后java 编译器会报告一个错误,让程序员自己解决这个问题。可以选择一个方法,也可以自己重写一个。
拓展:假如Named接口没有为getName方法提供默认实现。Student类会从Person接口继承默认方法吗?
答案:不会。如果至少有一个接口提供了一个实现,编译器就会报告错误,程序员就必须解决这个二义性。
//好吧今天到这,goodgoodbye!😃