java8中允许使用default关键字定义接口的默认方法,默认方法与抽象方法不同,不需要被实现类来具体实现,但是可以被实现类继承或重写。默认方法的出现提供了在不破坏接口的兼容性的前提下对接口进行扩展。
doSomething in BB
再定义一个接口的实现类:
当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。

java8中使用static关键字定义接口的静态方法,与一般java类中的静态方法一样。
public interface AA { static void helloWorld(){ System.out.println("hello world"); } default void doSomething(){ System.out.println("doSomething in AA"); } }
public interface BB { default void doSomething(){ System.out.println("doSomething in BB"); } }
public interface CC extends AA,BB{ //重新了父接口的默认方法 default void doSomething(){ System.out.println("doSomething in CC"); //只有直接父类才可以通过XX.super.xxMethod()的方式调用父类默认方法 AA.super.doSomething(); BB.super.doSomething(); } }
public class Test1 implements CC{ public static void main(String[] args) { CC cc = new Test1(); //调用接口的默认方法 cc.doSomething(); //调用接口的静态方法 AA.helloWorld(); } }
执行结果:
doSomething in CC
doSomething in AAdoSomething in BB
hello world
接口中静态方法,通过接口名调用
接口中的默认方法,通过引用对象调用
在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的。由于这些修饰符都是默认的,所以在JDK8之前,下面的写法都是等价的。
public interface JDK8BeforeInterface {
public static final int field1 = 0;
int field2 = 0;
public abstract void method1(int a) throws Exception;
void method2(int a) throws Exception;
}
public static final int field1 = 0;
int field2 = 0;
public abstract void method1(int a) throws Exception;
void method2(int a) throws Exception;
}
public interface JDK8Interface {
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("接口中的默认方法");
}
}
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("接口中的默认方法");
}
}
再定义一个接口的实现类:
public class JDK8InterfaceImpl implements JDK8Interface {
//实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写
}
//实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写
}
public class Main {
public static void main(String[] args) {
// static方法必须通过接口类调用
JDK8Interface.staticMethod();
//default方法必须通过实现类的对象调用
new JDK8InterfaceImpl().defaultMethod();
}
}
public static void main(String[] args) {
// static方法必须通过接口类调用
JDK8Interface.staticMethod();
//default方法必须通过实现类的对象调用
new JDK8InterfaceImpl().defaultMethod();
}
}
当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。
public class AnotherJDK8InterfaceImpl implements JDK8Interface {
// 签名跟接口default方法一致,但是不能再加default修饰符
@Override
public void defaultMethod() {
System.out.println("接口实现类覆盖了接口中的default");
}
}
// 签名跟接口default方法一致,但是不能再加default修饰符
@Override
public void defaultMethod() {
System.out.println("接口实现类覆盖了接口中的default");
}
}
由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?如果有两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。但是如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。
public interface JDK8Interface1 {
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("JDK8Interface1接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("JDK8Interface1接口中的默认方法");
}
}
// static修饰符定义静态方法
static void staticMethod() {
System.out.println("JDK8Interface1接口中的静态方法");
}
// default修饰符定义默认方法
default void defaultMethod() {
System.out.println("JDK8Interface1接口中的默认方法");
}
}
public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface1 {
// 由于JDK8Interface和JDK8Interface1中default方法一样,所以这里必须覆盖
@Override
public void defaultMethod() {
System.out.println("接口实现类覆盖了接口中的default");
}
}
// 由于JDK8Interface和JDK8Interface1中default方法一样,所以这里必须覆盖
@Override
public void defaultMethod() {
System.out.println("接口实现类覆盖了接口中的default");
}
}
public class Main {
public static void main(String[] args) {
JDK8Interface.staticMethod();
JDK8Interface1.staticMethod();
new JDK8InterfaceImpl().defaultMethod();
}
}
public static void main(String[] args) {
JDK8Interface.staticMethod();
JDK8Interface1.staticMethod();
new JDK8InterfaceImpl().defaultMethod();
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/aitangyong/article/details/54134385
本文详细介绍了Java8中接口的默认方法和静态方法的使用方式,包括如何定义、调用以及实现类如何重写这些方法。此外还讨论了当多个接口包含相同默认方法时的解决方案。
418

被折叠的 条评论
为什么被折叠?



