Java8新特性之接口中的默认方法和静态方法详解

作者:猫巳 时间:2022-05-10 15:16:19 

一、前言

Java 8 引入了默认方法以及可以在接口中定义的静态方法。

默认方法是一个普通的 java 方法,但以 default 关键字开头,静态方法像往常一样用 static 关键字声明。

二、为什么在 Java 接口中使用默认方法?

为什么java在接口中引入了默认方法。

假设一个拖拉机制造公司发布了操作拖拉机的标准接口,如如何挂挡或停车等。

开发者已经开发了不同类型的拖拉机来实现标准的拖拉机接口。

如果公司在其标准接口中增加了新的功能,如如何跳动拖拉机?

开发者需要对他们的类进行修改以定义新的方法,这不是一个好办法。

现在我们需要默认方法来处理这种情况,以避免重写所有实现标准拖拉机接口的类。

在接口中定义默认方法,它将在所有实现拖拉机接口的类中可用。

三、为什么在 Java 接口中使用静态方法?

Java 8 开始,接口可以具有静态方法。

静态方法与类相关联,而不与对象相关联。静态方法用作辅助方法。

所以如果我们在接口中声明静态方法,我们很容易组织我们的辅助方法。

四、场景一:接口中的默认方法

为了理解使用默认方法,我创建了一个接口 Village,它有一些方法声明和一个默认方法。

默认方法以 default 关键字开头。

默认情况下,接口的所有方法都是公共的,因此无需使用 public 关键字来声明和定义接口中的方法。

Village.java


public interface Village {
   void setNumOfPeople(int num);
   void setName(String name);
   default String getBusinessType(){
       return "Most of the Village people do Farming";
   }
}

创建一个将实现 Village 接口的 Location 类。

默认方法将自动在此类中可用。

Location.java


public class Location implements Village {
   public int noOfPeople;
   public String name;
   @Override
   public void setNumOfPeople(int n){
       this.noOfPeople = n;
   }
   @Override
   public void setName(String name){
       this.name = name;
   }
}

为了测试这个方案,创建一个Main类并通过Location对象访问默认方法。

Main.java


public class Main {
   public static void main(String[] args){
       Location lo = new Location();
       System.out.println(lo.getBusinessType());
   }    
}

输出

Most of the Village people do Farming

五、场景二:接口中的静态方法

现在我们也可以在接口中编写静态方法。在我们的Village接口中,我已经将getVillageId()声明为一个静态方法。

这个静态方法也可以在默认方法中被访问。


public interface Village {
   void setNumOfPeople(int num);
   void setName(String name);
   static int getVillageId(){
       return 1;
   }
   default String getBusinessType(){
       return "Business type is Farming  and village id:"+getVillageId();
   }
}

我对Location类做一些修改,以使用静态方法。

我们可以通过接口名称来使用静态方法。


public class Location implements Village {
   public int noOfPeople;
   public String name;
   @Override
   public void setNumOfPeople(int n){
       this.noOfPeople = n;
   }
   @Override
   public void setName(String name){
       this.name = name;
   }
   public int getLocationId(){
       return Village.getVillageId();
   }

Main.java


public class Main {
   public static void main(String[] args){
       Location lo = new Location();
       System.out.println(lo.getBusinessType());
       System.out.println("Village id:"+Village.getVillageId());
       System.out.println("Location Id:"+lo.getLocationId());
   }    
}

输出

Business type is Farming  and village id:1
Village id:1
Location Id:1

六、情景三:多重继承 - 在两个接口中使用相同名称的默认方法

在多重继承的情况下,一个类实现了不止一个接口,我们需要检查默认方法的行为方式。

现在我正在创建一个包含getBusinessType()默认方法的接口。

City.java


public interface City {
   void setName(String name);
   void setArea(int area);
   default String getBusinessType(){
       return "Service";
   }
}

对于多重继承,Location类将同时实现VillageCity接口。

由于VillageCity都包含同名的缺省方法,所以由于存在歧义,Location类将强制在类中明确定义缺省方法。

除非我们定义一个与默认方法同名的方法,否则Location类将不会被编译。

Location.java


public class Location implements Village, City {
   public int noOfPeople;
   public String name;
    public int area;
   @Override
   public void setNumOfPeople(int n){
       this.noOfPeople = n;
   }
   @Override
   public void setName(String name){
       this.name = name;
   }
   @Override
   public void setArea(int area){
       this.area = area;
   }
   @Override
   public String getBusinessType(){
       return "People do business like Farming and Service.";
   }
   public int getLocationId(){
       return Village.getVillageId();
   }
}

输出

People do business like Farming and Service.
Village id:1
Location Id:1

七、参考文献

【1】Java 8 Default and Static Method in Interface

来源:https://blog.csdn.net/qq_31635851/article/details/117665535

标签:Java,默认方法,静态方法
0
投稿

猜你喜欢

  • Java中SSM+Shiro系统登录验证码的实现方法

    2022-06-09 17:05:14
  • C#游戏开发之实现俄罗斯方块游戏

    2022-11-24 11:12:31
  • 剑指Offer之Java算法习题精讲链表与字符串及数组

    2022-10-03 19:10:17
  • java基础javeSE程序逻辑控制语法

    2022-09-21 23:41:47
  • 在Java中避免NullPointerException的解决方案

    2023-10-17 04:47:00
  • 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

    2022-03-26 18:43:02
  • 详解jvm对象的创建和分配

    2022-01-27 13:39:41
  • Java编程Nashorn实例代码

    2022-07-30 05:28:21
  • Java实现MD5消息摘要算法

    2023-06-18 06:37:35
  • SpringBoot+netty-socketio实现服务器端消息推送

    2023-11-15 06:14:31
  • C#函数式编程中的标准高阶函数详解

    2021-06-09 06:27:07
  • Springboot添加支付接口

    2023-06-21 00:10:20
  • Java处理InterruptedException异常的理论与实践

    2023-07-25 03:22:33
  • java使用异或实现变量互换和异或加密解密示例

    2023-10-19 16:53:38
  • C# 数独求解算法的实现

    2022-04-04 18:48:57
  • 基于Java接口回调详解

    2023-11-09 00:03:11
  • java统计字符串中指定元素出现次数方法

    2022-11-02 16:05:40
  • IntelliJ Plugin 开发之添加第三方jar的示例代码

    2021-11-27 13:35:52
  • 解析c#在未出现异常情况下查看当前调用堆栈的解决方法

    2023-05-18 02:54:04
  • Java中关于二叉树层序遍历深入了解

    2023-07-26 07:06:09
  • asp之家 软件编程 m.aspxhome.com