美文网首页
八 接口中的默认方法与静态方法

八 接口中的默认方法与静态方法

作者: 败给小萝莉 | 来源:发表于2019-04-13 00:09 被阅读0次

一、接口中的默认方法

Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 default 关键字修饰

public interface MyInterfce {
    default String getName(){
        return "MyInterfce interface";
    }
}

这其实对接口的使用更加友好了,在Java8之前,接口中只能有抽象的方法,如果接口中增加了业务方法,那实现该接口的那些类就都得进行修改,如果是我们已经封装好的业务类,那就得对原来的代码进行修改。现在有了默认方法的支持以后,我们可以对新增的业务直接在接口中写实现,然后可以正常调用,扩展性显然更友好。这就带来了一个新的问题:若一个接口中定义了一个默认方法,而另外一个父类或接口中定义了一个同名的方法时子类在调用这个同名方法时该怎么处理呢?

接口默认方法的 ” 类优先 ” 原则:

若一个接口中定义了一个默认方法,而另外一个父类或接口中定义了一个同名的方法时:

选择父类中的方法(父类与接口默认方法具有相同参数列表和方法名时):如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略

父类:

public class MyClass {
    public String getName(){
        return "MyClass class";
    }
}

接口

public interface MyFunction {
    default String getName () {
        return "MyFunction interface";
    }
}

子类:

public class SubClass extends MyClass implements MyInterfce {
}

测试:

    public static void main(String[] args) {
        SubClass sc = new SubClass();
        System.out.println(sc.getName());
    }

输出:MyClass class

接口冲突(子类实现的两个接口中具有相同参数列表且同名的默认方法时):如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法

接口1:

public interface MyInterfce {
    default String getName(){
        return "MyInterfce interface";
    }
}

接口2:

public interface MyFunction {
    default String getName () {
        return "MyFunction interface";
    }
}

子类:

public class SubClass implements MyFunction, MyInterfce {
}

此时子类就报错了,因为这种情况下子类对象调用该同名方法时就不知道怎么选择了,所以此时必须重写该同名方法,调用的时候直接忽略掉接口的方法,使用自己的:

public class SubClass implements MyFunction, MyInterfce {
    @Override
    public String getName() {
        return null;
    }
}

此时不再报错。这里还有另外一种情况:如果此时子类还继承了具有相同参数列表和方法名的类时(该类中的这个方法为非抽象方法),也不会报错,因为根据前面的“类优先原则”,此时子类对象如果调用该方法直接选择父类中的方法即可:


image.png

二、接口中的静态方法

Java8中,接口中允许添加静态方法

public interface MyFunction {
    //静态方法
    static void show(){
        System.out.println("MyFunction interface static method");
    }
}

调用和类一样:

MyFunction.show();

输出:MyFunction interface static method

相关文章

  • 八 接口中的默认方法与静态方法

    一、接口中的默认方法 Java 8中允许接口中包含具有具体实现的方法,该方法称为“默认方法”,默认方法使用 def...

  • 接口的变化

    1、JDK8之后对接口做了增加,接口中可以有默认方法和静态方法 2、接口中默认方法的语法规则 3、接口中静态方法的...

  • 接口中的默认方法与静态方法

    一、介绍 在Java8以前,接口中只能有抽象方法(public abstract 修饰的方法)跟全局静态常量(pu...

  • 接口的默认方法

    一、静态方法 1、接口中方法test默认缺省public abstract; 2、可以写静态方法,通过接口.方法名...

  • Java8特性之接口

    JDK1.8的特性 接口的特性 接口中可以定义静态方法,默认方法,并有方法体接口中定义的静态方法,只能通过接口去调...

  • Java 8新特性(详解)

    1. 接口中的默认方法与静态方法 java 8中接口可以有实现方法,方法用default关键字修饰 当接口和子类同...

  • Java基础教程(17)--接口

     就像类一样,接口也是引用类型。它可以包含常量,方法签名,默认方法,静态方法和嵌套类型。在接口中,只有默认方法和静...

  • Java8-接口中的默认方法与静态方法

    在Java8以前,我们知道接口中是不能够有方法的具体实现的,但是Java8中则允许有接口的默认实现。 我们先来个例...

  • 2019-06-09 jave核心代码看书笔记(六)接口、lam

    一,接口 1.接口中的静态方法:javaSE 8 中,允许在接口中增加静态的方法,目前为止,静态方法都是放在伴随类...

  • Java8之函数式接口

    函数式接口:接口中有且仅有一个抽象方法,可以存在多个非抽象方法,例如上述的默认方法和静态方法;可以用@Functi...

网友评论

      本文标题:八 接口中的默认方法与静态方法

      本文链接:https://www.haomeiwen.com/subject/fpjkwqtx.html