1、默认方法
1.1 概述
Java 8中允许接口中包含具有具体实现的方法,该方法称为“”默认方法“”,用default关键字修饰
示例代码如下:
interface Inter{
void show();//抽象方法
default void method() {
System.out.println("默认方法");
}
}
1.2 作用
供实现类调用或者实现类重写
1.3 说明
- 接口中,有多个默认方法时,实现类都可继承使用。
- 如果一个类实现了多个接口,且多个接口有重名的默认方法,实现类必须重写该方法。(实现类重写的默认方法,default关键字不可以保留)
- 当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。
- 一个接口继承多个接口时,如果多个父接口中存在重名抽象方法,那么子接口必须要重写该方法。(子接口重写的默认方法,default关键字可以保留)
示例代码如下:
interface InterFu{
default void show(){
System.out.println("showFu");
}
default void method(){
System.out.println("method");
}
}
interface InterMu{
default void show(){
System.out.println("showMu");
}
}
//4、一个接口继承多个接口时,如果父接口中存在重名抽象方法,那么子接口必须要重写该方法
interface InterZi extends InterFu,InterMu{
//方式1:不保留default,将该方法写成抽象方法
/*@Override
void show();*/
//方式2:保留default
@Override
default void show() {
System.out.println("showZi");
}
}
class Doo implements InterFu{}
class Foo implements InterFu,InterMu{
//2、一个类实现了多个接口,且多个接口有重名的默认方法,实现类必须重写该方法。
@Override
public void show() {
//在重写方法的时候,可以选择使用InterFu的show,也可以选择InterMu的show,也可以实现类自己重新定制
//InterFu.super.show();
System.out.println("实现类show");
}
}
class Fu{
public void show(){
System.out.println("fu show");
}
}
class Zi extends Fu implements InterFu{}
public class InterfaceDemo02 {
@Test
public void text01(){
//1、接口中,有多个默认方法时,实现类都可继承使用
new Doo().show();
new Doo().method();
}
@Test
public void text02(){
//3、当一个类继承一个父类且实现一个或多个接口的时候,如果父类中存在和接口中相同的方法名声明,子类会调用父类中的方法
new Zi().show();//"fu show"
}
}
2、静态方法
1.1 概述
Java 8中允许接口中包含静态方法
示例代码如下:
interface MyInter{
public static String getName(){
return "Tom";
}
}
1.2 作用
主要是供接口使用,比如说为默认方法提供某些功能。
示例代码如下:
interface MyInter{
//默认方法
default String getName(){
return MyInter.joinName("张", "三丰", String::concat);
}
//静态方法
public static String joinName(String surname, String name, BiFunction<String, String, String> bf){
return bf.apply(surname, name);
}
}