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

在Java8之前的版本中,接口中只能声明常量和抽象方法,接口的实现类中必须实现接口中所有的抽象方法。而在Java8中,接口中可以声明
默认方法


静态方法


接口中的默认方法

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

,默认方法使用
“ default ”

关键字修饰 。


示例:

public interface MyInterface {
    default String getMsg(String srcMsg){
        return "======"+srcMsg;
    }
}

接口中的默认方法,有一个
“类优先”

原则:

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

  • 选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称的参数的默认方法会被忽略。
  • 接口冲突。如果一个父接口提供一个默认方法,而另一个接口中也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突。


示例1:

public interface MyInterface1 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface1111111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MyClass1 {
    public String getMsg(String srcMsg){
        return "===我是MyClass11111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MySubClass1 extends MyClass1 implements MyInterface1 {
}

///////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass1 ms1 = new MySubClass1();

        String srcMsg = "Java 牛逼!!";
        //MySubClass1 类继承了 MyClass1 类,实现了MyInterface1 接口,根据类优先原则,调用同名方法时,会忽略掉接口 MyInterface1 中的默认方法。
        System.out.println(ms1.getMsg(srcMsg));//输出结果:===我是MyClass11111===Java 牛逼!!

    }
}

示例2:

public interface MyInterface2 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface2222222==="+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class MySubClass2 implements MyInterface1,MyInterface2 {
    @Override
    public String getMsg(String srcMsg) {
        //同时实现了 MyInterface1,MyInterface2  接口,根据 类优先 原则,两个父接口中都提供了相同的方法,那么子类中就必须重写这个方法来解决冲突。
        return MyInterface1.super.getMsg(srcMsg);
        //return MyInterface2.super.getMsg(srcMsg);
        //return "------"+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass2 ms2 = new MySubClass2();

        //MySubClass2 重新实现了两个父接口中都存在的相同名称的方法。
        System.out.println(ms2.getMsg(srcMsg));//输出结果:===我是MyInterface1111111===Java 牛逼!!
    }
}

接口中的静态方法

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

,使用方式:
“接口名.方法名”


示例:

public interface MyInterface3 {
    static String getMsg(String msg){
        return "我是接口中的静态方法:"+msg;
    }

    static void main(String[] args) {
        System.out.println(MyInterface3.getMsg("Java牛逼!!"));
    }
}

原文 

http://www.cnblogs.com/y3blogs/p/13172431.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 接口中的默认方法与静态方法

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址