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

 更新时间:2021年06月09日 16:18:54   作者:猫巳  
今天带大家学习的是Java8新特性的相关知识,文章围绕着Java接口中的默认方法和静态方法展开,文中有非常详细的的代码示例,需要的朋友可以参考下

一、前言

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

到此这篇关于Java8新特性之接口中的默认方法和静态方法详解的文章就介绍到这了,更多相关Java默认方法和静态方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java通过SSH连接路由器输入命令并读取响应的操作方法

    Java通过SSH连接路由器输入命令并读取响应的操作方法

    最近需要读取和修改华为路由器的配置,使用Java语言开发,通过SSH连接,输入命令并读取响应,接下来通过本文给大家介绍下Java通过SSH连接路由器,输入命令并读取响应,需要的朋友可以参考下
    2024-01-01
  • Java控制台版五子棋的简单实现方法

    Java控制台版五子棋的简单实现方法

    这篇文章主要给大家介绍了关于Java控制台版五子棋的简单实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java中Volatile关键字详解及代码示例

    Java中Volatile关键字详解及代码示例

    这篇文章主要介绍了Java中Volatile关键字详解及代码示例,分为两个部分,第一部分介绍了Volatile关键字的基本概念等内容,第二部分分享了实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • rocketmq client 日志的问题处理方式

    rocketmq client 日志的问题处理方式

    这篇文章主要介绍了rocketmq client 日志的问题处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • spring声明式事务管理解析

    spring声明式事务管理解析

    这篇文章主要为大家详细介绍了spring声明式事务管理,对spring事务管理进行深入了解,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • java驼峰转换的方法

    java驼峰转换的方法

    这篇文章主要为大家详细介绍了java驼峰转换的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • SpringBoot3整合Swagger3时出现Type javax.servlet.http.H的ttpServletRequest not present错误解决方法

    SpringBoot3整合Swagger3时出现Type javax.servlet.http.H的ttpSe

    这篇文章主要介绍了SpringBoot3整合Swagger3时出现Type javax.servlet.http.H的ttpServletRequest not present错误解决方法,文中有详细的解决方法,需要的朋友可以参考下
    2025-01-01
  • List转变为逗号分隔的String(Java7和Java8分别实现)

    List转变为逗号分隔的String(Java7和Java8分别实现)

    这篇文章主要介绍了Java7和Java8分别实现List转变为逗号分隔的String,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • JAVA找不到符号的三种解决方案

    JAVA找不到符号的三种解决方案

    这篇文章主要给大家介绍了关于JAVA找不到符号的三种解决方案, 找不到符号错误主要发生在我们试图引用一个未在我们正在编译的程序中声明的变量时,这意味着编译器不知道我们所引用的Java变量,需要的朋友可以参考下
    2024-03-03
  • java如何通过Kerberos认证方式连接hive

    java如何通过Kerberos认证方式连接hive

    该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过Kerberos认证与Hive进行安全交互,文章详细描述了Kerberos认证过程,包括配置krb5.conf和keytab文件、处理Hadoop和Hive版本兼容性问题
    2025-02-02

最新评论