「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
default修饰符
为什么要有默认方法?
当接口需要增加一个方法,那么所有它的实现类都需要实现这个方法,改动会很大.
使用defalut修饰后,可以直接在接口中实现方法.默认所有实现类都实现了这个方法,对于需要实现这个方法的实现类可以重写这个方法.
例子
在接口中,可以使用defalut修饰方法,实现方法体
public interface defalutInterface {
void getName();
// 使用default 可以实现方法体
default void getNames() {
System.out.println("name");
}
}
实现类可以不用实现default修饰的方法,直接继承并使用.
public static void main(String[] args) {
defaultClass defaultClass = new defaultClass();
// 不实现可以直接调用
defaultClass.getNames();
// 输出name
}
}
实现类可以重写方法
@Override
public void getNames() {
System.out.println("className");
}
// 输出从className
冲突问题
💡 接口继承多接口 / 实现类多实现public interface animals {
default void eat() {
System.out.println("动物吃饭");
}
}
public interface people {
default void eat() {
System.out.println("人吃饭");
}
}
当实现多个接口,这几个接口都有一个同名的默认方法.那么系统就会不知道该实现哪一个,报错,就需要重写
这种选择情况其实和多继承的选择问题比较类似(当然java不允许多继承,可能也有这方面的考虑);
实习类实现同的问题,需要重写
优先级
1.default方法优先于接口普通方法:当子接口的defalut方法名和父接口的普通/default方法名重名,父类方法失效
2.实现类的父类继承的方法优先于接口的default方法:当父类的继承方法和接口的默认方法同名,父类的方法优先.
综上来看:实现的方法优先于抽象方法,实现类优先于接口