发布于2021-06-12 13:49 阅读(972) 评论(0) 点赞(10) 收藏(3)
Java8中,可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只
Java8中,可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念。
接口中的静态方法:
使用 static 关键字修饰。 可以通过接口直接调用静态方法,并执行其方法体。我们经常在相互一起使用的类中使用静态方法。可以在标准库中找到像Collection/Collections或者Path/Paths这样成对的接口和类。
接口中的默认方法:
默认方法使用 default 关键字修饰。可以通过实现类对象来调用。在已有的接口中提供新方法的同时,还保持了与旧版本代码的兼容性。
比如: java 8 API中对Collection、 List、 Comparator等接口提供了丰富的默认方法。
接口中定义的静态方法,只能通过接口来调用,不能通过实现类或其对象来调用,说白了,接口中的静态方法不是给实现类用的
通过实现类的对象,可以调用接口中的默认方法
类优先原则:
如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。
接口冲突:
如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下报错。这就需要我们必须在实现类中重写此方法
Duplicate default methods named defaultMethod3 with the parameters () and () are inherited from the types InterfaceB and InterfaceA
如何在子类(或实现类)的方法中调用父类、接口中被重写的方法 --- 例如 CompareA.super.method3();
- //InterfaceA.java
- package com.ylaihui.oop13;
-
- public interface InterfaceA {
- // 静态方法
- public static void staticMethod(){
- System.out.println("interface staticMethod...");
- }
- // 默认方法
- public default void defaultMethod(){
- System.out.println("interface defaultMethod...");
- }
- public default void defaultMethod1(){
- System.out.println("interface defaultMethod1...");
- }
- public default void defaultMethod2(){
- System.out.println("interface defaultMethod2...");
- }
- public default void defaultMethod3(){
- System.out.println("interface defaultMethod3...");
- }
- }
- //SuperClass.java
- package com.ylaihui.oop13;
-
- public class SuperClass {
- public void defaultMethod2(){
- System.out.println("SuperClass defaultMethod...");
- }
- }
- //SubClassTest.java
- package com.ylaihui.oop13;
-
- class subClass extends SuperClass implements InterfaceA,InterfaceB{
- public void defaultMethod1(){
- System.out.println("subClass defaultMethod1...");
- }
-
- // 如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,
- // 那么在实现类没有重写此方法的情况下,报错。-->接口冲突。
- // 这就需要我们必须在实现类中重写此方法
- public void defaultMethod3() {
- System.out.println("subClass defaultMethod3...");
- }
- public void Method(){
- // 在子类(或实现类)的方法中调用父类、接口中被重写的方法
- InterfaceA.super.defaultMethod3();
- }
- }
-
- public class SubClassTest {
- public static void main(String[] args) {
- subClass sc = new subClass();
- // 接口中定义的静态方法,只能通过接口来调用,不能通过实现类或其对象来调用
- // sc.staticMethod(); // The method staticMethod() is undefined for the type subClass
- InterfaceA.staticMethod();
-
- // 通过实现类的对象,可以调用接口中的默认方法
- sc.defaultMethod();
-
- // 如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
- sc.defaultMethod1(); // subClass defaultMethod1...
-
- // 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,
- // 那么子类在没有重写此方法的情况下,
- // 默认调用的是父类中的同名同参数的方法,而非调用的接口中的默认方法
- sc.defaultMethod2(); // SuperClass defaultMethod...
-
- }
- }
代码输出
interface staticMethod...
interface defaultMethod...
subClass defaultMethod1...
SuperClass defaultMethod...
原文链接:https://blog.csdn.net/asdfjklingok/article/details/117744551
作者:java王侯
链接:http://www.javaheidong.com/blog/article/222095/ba358e2abbb7a18f9798/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!