zoukankan      html  css  js  c++  java
  • 接口中的默认方法与静态方法

    在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请求
    详解Vue中的虚拟DOM
    SQL Server 2005 和自增长主键identity说再见——NEWSEQUENTIALID()(转载)
    调用SqlCommand或SqlDataAdapter的Dispose方法,是否会关闭绑定的SqlConnection?(转载)
    如何取消 SqlDataAdapter.Fill() 的执行(转载)
    SQL Server备份时间段内插入的数据依旧进入了备份文件?(转载)
    何谓SQLSERVER参数嗅探(转载)
    关于T-SQL重编译那点事,WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗 (链接)
    SQL Server中,如何查看每个数据库的Owner是哪个SQL Server账户,也就是谁创建的
    SQL Server中INSERT EXEC语句不能嵌套使用(转载)
  • 原文地址:https://www.cnblogs.com/y3blogs/p/13172431.html
Copyright © 2011-2022 走看看