接口的加强
JDK1.8之前的接口定义:
- 接口就是抽象方法和去全局常量的集合;
- 接口中定义的方法是抽象方法,默认是
public abstract
修饰; - 在接口中定义的变量,其实是一个常量,并且是
public static final
修饰。
如果现在有一个需要,需要在接口中增加一个新的功能,而它的子类有
3W
个,那么就要重复粘贴3W
次。
造成该问题的原因是:因为接口只是一个方法的声明,而没有具体的实现,所以随着时间的推移,接口就无法使用。
为了解决以上的问题,专门提供了两类新的结构。
JDK1.8之后的接口定义:
- 使用
default
来定义普通方法,需要通过对象调用; - 使用
static
来定义静态方法,通过接口名就可以调用。
举例:定义普通方法
public interface Message {
void print();
/**
* 如果增加一个greeting方法,那么子类都要实现它,否则都会报错,
* 如果子类数量相当多,那么实现起来很困难,因此引入了默认方法。
*/
//追加了普通方法,必须有方法体
default void greeting(){
System.out.println("default greeting!");
}
}
public class QQMessage implements Message{
@Override
public void print() {
System.out.println("print QQMessage!");
}
}
public class WeiXinMessage implements Message{
@Override
public void print() {
System.out.println("print WeiXinMessage!");
}
}
public class TestMessage {
public static void main(String[] args) {
//此处也可以写成QQMessage的对象调用greeting方法,
//类似继承,它是一个普通方法,将它继承下来。
Message qq = new QQMessage();
qq.print();
qq.greeting();
}
}
如果对父类的方法不满意,子类也可以根据实际情况进行覆写。那么父类对象调用的就是子类覆写的普通方法。
举例:定义static方法
public interface Message {
void print();
default void greeting(){
System.out.println("default greeting!");
}
//可以直接通过接口名称调用 Message.messageInfo()
static void messageInfo(){
System.out.println("static 方法");
}
}
整体来讲,接口感觉更像抽象类了,但是比抽象类更强大的在于:接口的子类可以继承多个父接口,而抽象类是能实现单继承。