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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java中SSM+Shiro系统登录验证码的实现方法
![](https://img.aspxhome.com/file/2023/0/69070_0s.png)
C#游戏开发之实现俄罗斯方块游戏
![](https://img.aspxhome.com/file/2023/7/88337_0s.png)
剑指Offer之Java算法习题精讲链表与字符串及数组
![](https://img.aspxhome.com/file/2023/2/62732_0s.png)
java基础javeSE程序逻辑控制语法
![](https://img.aspxhome.com/file/2023/4/79914_0s.png)
在Java中避免NullPointerException的解决方案
详解C# 匿名对象(匿名类型)、var、动态类型 dynamic
![](https://img.aspxhome.com/file/2023/8/72458_0s.png)
详解jvm对象的创建和分配
![](https://img.aspxhome.com/file/2023/0/75800_0s.png)
Java编程Nashorn实例代码
Java实现MD5消息摘要算法
SpringBoot+netty-socketio实现服务器端消息推送
C#函数式编程中的标准高阶函数详解
![](https://img.aspxhome.com/file/2023/3/85673_0s.png)
Springboot添加支付接口
![](https://img.aspxhome.com/file/2023/5/77085_0s.png)
Java处理InterruptedException异常的理论与实践
java使用异或实现变量互换和异或加密解密示例
C# 数独求解算法的实现
![](https://img.aspxhome.com/file/2023/2/68102_0s.png)
基于Java接口回调详解
![](https://img.aspxhome.com/file/2023/4/59314_0s.png)
java统计字符串中指定元素出现次数方法
![](https://img.aspxhome.com/file/2023/9/78969_0s.jpg)
IntelliJ Plugin 开发之添加第三方jar的示例代码
![](https://img.aspxhome.com/file/2023/5/77105_0s.png)
解析c#在未出现异常情况下查看当前调用堆栈的解决方法
Java中关于二叉树层序遍历深入了解
![](https://img.aspxhome.com/file/2023/6/61076_0s.png)