个人博客:www.letus179.com
JDK8之前我们在接口中定义成员变量
只能是public static final
的,定义的成员方法
只能是public abstract
的,默认省略。JDK8前后这一概念等价。定义接口BeforeJDK8Interface
如下:
name
和name1
表述等价,getName()
和getName1()
表述等价。
public interface BeforeJDK8Interface {
String name = "BeforeJDK8Interface";
//public、 static、 final 可以单独使用,也可以组合使用
public static final String name1 = "BeforeJDK8Interface";
void getName();
//public、 abstract 可以单独使用,也可以组合使用
public abstract void getName1();
}
JDK8新增特性,允许我们在接口中定义default默认方法和static静态方法。定义接口JDK8Interface
如下:
public interface JDK8Interface {
default void myDefaultMethod() {
System.out.println("JDK8新特性:接口中的默认方法");
}
static void myStaticMethod() {
System.out.println("JDK8新特性:接口中的静态方法");
}
}
实现接口时,这里static方法由于static
的原因,属于接口类,只能通过 接口类名直接调用;
而default方法,需要 接口实现类实例化后调用。定义接口实现类JDK8InterfaceImpl
如下:
public class JDK8InterfaceImpl implements JDK8Interface {
public static void main(String[] args) {
JDK8Interface.myStaticMethod();
JDK8InterfaceImpl jdk8Interface = new JDK8InterfaceImpl();
jdk8Interface.myDefaultMethod();
}
}
由于static
的原因,静态方法不能重写;但是default方法却可以,重写myDefaultMethod
代码如下:
public class JDK8InterfaceImpl implements JDK8Interface {
...
@Override
public void myDefaultMethod() {
System.out.println("接口中的default方法不满足需求,需要重写");
}
}
这里稍注意下,JDK8Interface
接口中default
方法用了修饰符"default"
,这里重写后修饰符是"public"
由于java实行的是单继承extends
多实现implements
,那JDK8
新增特性中的两个方法有啥要求不?
- 首先看看
static
方法,由于调用static方法时,用的是接口类名,不能的接口类名肯定不同,所以没影响; - 对于
default
方法, 有于是实现类实例化后调用,若该类有多个接口
且接口中有相同名称
的default方法,这时候编译器就没办法区分了,会报错,必须重写default方法。