博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java 8 新特性】Java 8接口中的默认方法和静态方法
阅读量:3764 次
发布时间:2019-05-22

本文共 3587 字,大约阅读时间需要 11 分钟。

Java 8接口中的默认方法和静态方法

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:1Village id:1Location 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:1Location Id:1

参考文献

转载地址:http://hogsn.baihongyu.com/

你可能感兴趣的文章
pycharm 使用小技巧---方便快捷获取python安装库
查看>>
PyCharm安装及使用
查看>>
微服务架构(一):什么是微服务
查看>>
微服务架构(二):融入微服务的企业集成架构
查看>>
【程序员必看】如何用Python从0开始创建一个区块链?
查看>>
程序猿们,别着急入手区块链,先给自己选好武林门派再练功不迟
查看>>
教你仅用15分钟在以太坊编写一个区块链Web应用
查看>>
版本控制
查看>>
几种常用的版本控制系统优缺点比较
查看>>
版本控制:SVN和GIT的一些使用感受
查看>>
RAID 技术全解
查看>>
DELL R720 服务器 RAID阵列卡配置介绍
查看>>
SVN服务器部署并实现双机同步及禁止普通用户删除文件
查看>>
SVN服务器搭建和使用(一)
查看>>
SVN服务器搭建和使用(二)
查看>>
SVN服务器搭建和使用(三)
查看>>
文件服务器的配置与管理(1) RAID技术
查看>>
文件服务器的配置与管理(2) 实现软RAID
查看>>
文件服务器的配置与管理(3) 共享文件夹的创建与使用
查看>>
TortoiseSVN新人使用指南
查看>>