纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

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

猫巳   2021-06-09 我要评论
想了解Java8新特性之接口中的默认方法和静态方法详解的相关内容吗猫巳在本文为您仔细讲解Java默认方法和静态方法的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Java默认方法,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


相关文章

猜您喜欢

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式