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
类将同时实现Village
和City
接口。
由于Village
和City
都包含同名的缺省方法,所以由于存在歧义,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


猜你喜欢
- 写项目时,要求仿微信朋友圈,双击顶栏置顶,于是封装了双击回调接口,方便大家拿来就用/** * Created by Administrato
- 用VS2010 + OpenCV 2.4.9 实现简单人脸识别,供大家参考,具体内容如下首先放效果图(为了防止辣眼睛,后期处理了下):首先声
- 安装hbase首先下载hbase的最新稳定版本 http://www.apache.org/dyn/closer.cgi/hbas
- Parallel类是对线程的一个抽象。该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性。Paralle
- 一、前言Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的。实现圆角图片的方法其实不少
- 一.介绍Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring
- 此问题背景产生于近期需要上线的一个功能的埋点;主要表现就是在应用启动之后的一段时间内,内存使用一直呈现递增趋势。下图为场景复线后,本地通过
- 先利用jsoup将得到的html代码“标准化”(Jsoup.parse(String html))方法,然后利用FileWiter将此htm
- 这篇文章主要介绍了JAVA如何按字节截取字符串,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
- 1:引入依赖<dependency> <
- 核心配置文件mybatis-config.xml 系统核心配置文件MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属
- 1. Mybatis JdbcType与Oracle、MySql数据类型对应列表MybatisJdbcTypeOracleMySqlJdbc
- 有时候我们需要判断栈顶的应用是否是我们的应用,于是获取栈顶的应用包名的需求就出现了。在android5.0之前,系统提供了一套API可以实现
- 网上查找资料要么是细节不够失败要么是根本没用也不需要这么复杂,在这里总结一下本人在宝塔部署前端和后端的方法。1.在宝塔上添加站点&u
- 1.理解全过程1.1.概述需要具备的知识Socket网络编程反向代理的理解平滑加权轮询算法的理解线程池的理解目的:实现Socket 集群服务
- 一、首先我们先创建一个Maven项目把我们需要的包先准备好 1.打开pom.xml文件引入依赖,以下是整个pom.xml文件<
- 前言Google终于发布了一个和SQLite相关的库了。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间
- 这篇文章主要介绍了SpringBoot项目的测试类实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 使用datatables自带后台查询 前台代码:<!DOCTYPE html><html><head>&
- 1、作用域1.1 作用域的作用作用域——scope通常来说,一段程序代码中所用到的名字并不总是有效/