为什么要引入接口新特性:
某些时候,实现我们定义的接口的所有类,对接口中的抽象方法重写时,实现的功能可能是完全一致的,此时引入default关键字可以进一步抽象。
接口的定义:
// @FunctionalInterface -->如果加此注解表明该接口是一个函数式接口,只能有一个抽象方法
public interface DefaultAndStaticDemo1 {
/**
* 被default定义的方法:
* 1. 可以直接在里面写方法体,
* 2. 不需要被实现的类重写
* 3. 可以直接new实现该接口的类来调用
* 被static定义的方法:
* 1. 可以直接在里面写方法体
* 2. 不可以被实现类重写
* 3. 可以用接口名调用
* 抽象方法:不能有方法的具体实现,需要被实现类重写
*/
void sayDemo1();
default void runDemo1() {
System.out.println("runDemo1 in interface");
}
default void jumpDemo1() {
System.out.println("jumpDemo1 in interface");
}
static void eatDemo1() {
System.out.println("eatDemo1 in interface");
}
static void drinkDemo1() {
System.out.println("drinkDemo1 in interface");
}
}
实现类调用:
新玩意:接口.super.default()方法可以直接调用实现的接口中的default方法
public class TestExtendsDemo1 implements DefaultAndStaticDemo1 {
@Override
public void sayDemo1() {
System.out.println("sayDemo1 in class");
}
@Override
public void jumpDemo1() {
// 接口.super.default方法可以直接调用接口中的方法,
DefaultAndStaticDemo1.super.jumpDemo1();
System.out.println("jumpDemo1 in class");
}
/*@Override -->static方法会报错
public void eatDemo1() {}*/
public static void main(String args[]) {
TestExtendsDemo1 testExtendsDemo1 = new TestExtendsDemo1();
testExtendsDemo1.sayDemo1();
testExtendsDemo1.jumpDemo1();
testExtendsDemo1.runDemo1();
DefaultAndStaticDemo1.eatDemo1();
// DefaultAndStaticDemo1.super.jumpDemo1(); 这个地方不能使用,会报错,原因还在研究
}
}
实现类不能实现多个拥有相同default方法的接口
定义一个demo2接口,其中包括和demo1中相同的方法
public interface DefaultAndStaticDemo2 {
default void runDemo1() {
System.out.println("runDemo2 in interface");
}
}
定义一个实现类:
public class TestExtendsDemo2 implements DefaultAndStaticDemo1,DefaultAndStaticDemo2 {
@Override
public void sayDemo1() {
System.out.println("sayDemo1 in class");
}
}
此时会编译错误:
可以通过在实现类中重写该方法来解决:
public class TestExtendsDemo2 implements DefaultAndStaticDemo1,DefaultAndStaticDemo2 {
@Override
public void sayDemo1() {
System.out.println("sayDemo1 in class");
}
@Override
public void runDemo1() {
}
}
抽象类和接口拥有相同方法名的方法的问题
假设一个实现类实现了一个接口继承了一个抽象类,接口中拥有和抽象类中相同名称的default方法,则必须重写该方法
抽象类:
public abstract class AbstractDemo1 {
abstract void runDemo1();
}
实现类:
public class TestExtendsDemo2 extends AbstractDemo1 implements DefaultAndStaticDemo1 {
@Override
public void sayDemo1() {
System.out.println("sayDemo1 in class");
}
@Override
public void runDemo1() {
// System.out.println("runDemo1 in class");
}
}