开始学习使用Java接口

63 阅读5分钟

开始使用Java接口

java中的接口允许开发者构建可重用、可测试、可扩展和可耦合的组件。接口在类中使用时发挥着重要作用,例如,那些相互依赖的类。

让我们假设我们有两个类,X和Z,其中X类依赖于Z类,如果我们改变Z类,X将受到影响。为了减少这种影响,我们在类之间设置接口,这样当我们改变Z类的代码时,就不会影响X类的代码。

在一个有很多类相互依赖的大型复杂应用中,我们可以使用接口来解耦这些类,这样当我们改变一个类中的一行代码时,就会减少对其他类的影响。

前提条件

学习这篇文章,最好具备以下条件。

  • 对Java编程语言的基本知识和理解。
  • 对Java类和继承的基本了解。
  • 安装有IntelliJIDEA。

1.什么是java中的接口?

一个接口是多个类可以继承的方法的集合。

要创建一个接口,你需要使用关键字interface ,如下图所示。

public interface MyInterface {
    void method1();
    void method2();
    void method3();
}

在上面的例子中,我们有一个名为MyInterface 的接口,有三个定义的方法。

接口和类

一个接口说明了实现它的类要做什么,而一个类则解释了应该如何实现它。

为了理解这一点,让我们看一下下面的代码片段。

public interface bird {
    void sound();
}

在上面的代码片断中,我们有一个名为bird 的接口。这个接口有一个名为sound 的方法。

我们有不同类型的鸟,它们发出不同的声音。例如,乌鸦发出的声音是 "Caw Caw"。

public class Crow implements bird {
   @Override  #  override keyword instructs the compiler that the method sound is implementing an interface method
    public void sound() {
        System. out.println("Caw Caw");
    }
}

另一种鸟鹦鹉发出的声音是 "Kwi Kwi Kwi"。

public class parrot implements bird {
    @Override
    public void sound() {
        System.out.println("Kwi Kwi Kwi");
    }
}

在上面的片段中,Crowparrot 都实现了接口bird 。然而,这两只鸟的声音是不同的,也就是说,bird 类独立地使用了接口方法。

接口负责产生鸟的声音,而类则显示声音的产生("Caw Caw "和 "Kwi Kwi Kwi")。

注意:当一个类的声音实现了一个鸟的接口时,它有义务包括接口中的所有方法,也就是说,当你实现一个接口时,就像在类和接口之间建立了一个 "合同"。你必须包括接口中的所有方法。

声明接口的规则

  • @Override annotation ,应该在接口所实现的所有方法上使用。
  • 接口被说成是它们和实现它们的类之间的一个联系。每当一个接口被编辑时,实现它的类也应该被编辑。
  • 接口可以继承其他多个接口。
  • 接口的方法总是公开的。
  • 接口不能有构造函数。它们不能创建一个对象。

2.实现接口的好处

接口有几个好处。其中一些是。

  • 能够扩展你的应用程序。
  • 能够孤立地测试一个类。
  • 能够在不同的类中重复使用代码。
  • 捕捉代码中的错误。接口可以捕捉你代码中的任何错误。例如,如果你忘记在你的类中包含接口中的任何方法,编译器会让你知道。

在代码中演示接口

要做到这一点,打开你的IntelliJ IDEA并创建一个新的目录interface。在/interface ,创建一个接口文件sound ,并添加下面的片段。

public interface sound {
    void noisy();
    void soft();
}

在上面的接口片段中,我们有两个方法。noisy,另一个是soft

现在,让我们在目录/interface 中创建Catdog 类,分别添加下面的代码段。

public class cat implements sound{
    public static void main(String args[]){
        cat ex = new cat();
        ex.noisy();
        ex.soft();
    }
   @Override //  helps java to keep track on what is being implemented in the interface
    public void noisy() {
        System.out.println("purrs");
    }
    @Override
    public void soft(){
        System.out.println("meow");
    }
}
public class dog implements sound{
    public static void main(String args[]){
    dog ex = new dog();
    ex.noisy();
    ex.soft();
    }
    @Override
    public void noisy() {
        System.out.println("Noisy voice: "+" woof");
    }
    @Override
    public void soft() {
        System.out.println("soft voice: "+" bark");
    }
}

为了执行代码段(e.g., dog. class) ,在IntelliJ IDEA中打开终端,输入以下命令。

$ javac dog.java
$ java dog

输出结果将是。

Noisy voice:  growl
soft voice:  bark

3.接口隔离原则(ISP)

为了理解这个原则,让我们把它与一个有多个充电端口的移动充电器联系起来--C型端口、USB端口1、USB端口2,以及其他许多端口。所有这些类型的端口都连接到一个移动充电器头。虽然充电器有许多端口,但只需要一个端口就可以为一部手机充电。

Interface segregation principle(ISP) 指出,接口不应该有实现它们的类所不需要的方法。广泛的接口应该被分成较小的接口,每个接口执行不同的任务。

ISP演示

让我们在IntelliJ IDEA中创建一个新的目录hotel 。在/hotel ,创建一个接口/hotel/main.java ,并添加下面的片段。

public interface hotel1 {
    void room();
    void food();
    void drink();
}

在上面的接口片段中,我们有三个方法。room,food, 和drink ,这意味着我们可以在类hotel1 中获得一个房间、食物和饮料。让我们在/hotel1 中创建类Beverages ,并添加下面的代码段。

public class Beverages {
    public void drink(hotel1  drinking){
        drinking.drink();
        System.out.println("Ordering coffee");
    }
}

在上面的片段中,类Beverages 是依赖于接口hotel1 。如果我们改变接口hotel1 ,该类就会受到影响。让我们编辑我们的接口,如下图所示。

public interface hotel1 {
    void room(int size);
    void food();
    void drink();
}

改变能力void room() ,将影响到类beverages 和其他与该接口耦合的类。为了避免这种情况,我们使用ISP 原则。让我们把我们的接口划分成更小的接口,每个接口将专注于不同的能力。

public interface Drinking {
    void drink();
}

在生成一个新的接口时,我们的旧接口将如下图所示。

public interface hotel1 {
    void room(int size);
    void food();
}

现在我们已经生成了一个轻量级的接口(Drinking),它将只关注喝酒的能力。

总结

在处理包含多个相互依赖的类的大型应用程序时,使用接口是明智的,因为它们可以帮助你调试代码,使你的代码更易于维护。