Java中的接口

时间:2020-01-09 10:34:45  来源:igfitidea点击:

Java中的接口有助于完全抽象该类的实现。接口充当类的协定,详细说明了任何外部实体可以调用哪些方法而没有实际提供方法应做什么。实现接口的类必须提供行为(实现接口中定义的方法)。

如何用Java创建接口

Java中的接口是通过使用interface关键字创建的。界面中的所有字段都是自动的public,static和final。接口中的方法没有主体(只有方法签名),默认情况下是公共的和抽象的。

请注意,Java 8向前接口可以具有默认方法和静态方法,并且接口中也可以允许Java 9向前私有方法。在本文中,我们将讨论标准形式和原始形式的界面。

Java接口的语法

access_modifier interface Interface_Name{
  type var1 = value;
  type var2 = value;

  return_type methodName1(arguments);
  return_type methodName2(arguments);

  ..
  ..
}

接口的有效访问修饰符是默认访问权限(如果未指定访问修饰符)和公共访问权限。默认表示接口仅在创建它的包中可用,public表示也可以从所有其他包中访问它。
注意,方法签名以分号结尾,没有实现。

用Java创建和实现接口

在此Java示例中,有一个接口Payment与一种方法doPayment(双倍金额),由两个类CashPayment和CCPayment实现。

public interface Payment {
  void doPayment(double amount);
}

实施类

要使用接口,请编写实现该接口的类。在Java中实现接口的类必须先实现该接口定义的所有方法,然后该类才能成功编译。如果class没有实现接口的所有方法,则应将其声明为抽象类。

public class CashPayment implements Payment {
  @Override
  public void doPayment(double amount) {
    System.out.println("Cash payment of amount- " + amount);
  }
}

public class CCPayment implements Payment {
  @Override
  public void doPayment(double amount) {
    System.out.println("Swipe credit card for amount- " + amount);
  }
}

如我们所见,定义了一个接口,该接口仅声明一个方法,而将方法实现留给实现此接口的类。实现接口的类必须在类定义中包含Implements关键字。

Java接口的功能

让我们以上面的示例为参考,了解有关Java接口的一些要点。

  • Java接口中不能有实例变量,只能有公共,静态和最终常量。例如,尝试在Payment接口as-public String name中添加一个实例变量;导致编译时错误"空白的最终字段名称可能尚未初始化"。

  • 无法实例化Java接口。尝试创建这样的Payment接口实例-Payment payment = new Payment();导致编译时错误"无法实例化付款类型"。

  • 由于无法实例化接口,因此Java中的接口不能具有构造函数。

  • 虽然无法实例化接口,但是可以创建接口的对象引用。该对象引用可以引用实现此接口的任何类的实例。这就是Java中的界面如何帮助实现运行时多态性。在上面的示例中,我们可以看到"付款"接口的引用已创建-付款付款;它引用实现类对象并调用适当的doPayment()方法。在运行时动态查找必须执行的方法。

  • 一个类可以实现多个接口,这是Java中具有多重继承的唯一方法。对于类,Java不允许多重继承,因此我们不能在Java中扩展多个类。

  • 当一个类实现多个接口时,接口之间用逗号分隔。

class class_name implements interface 1, interface 2{
   ..
   ..
}

接口扩展了另一个接口

一个类实现了一个接口,但是一个接口使用extend关键字在Java中扩展了另一个接口。一个接口可以扩展多个接口。

当类实现继承了另一个接口的接口时,该类必须在所有这些接口中实现所有方法。

Java示例

interface A{
  int add(int a, int b);
}

interface B extends A{
  int subtract(int a, int b);
}

public class MainClass implements B{
  @Override
  public int subtract(int a, int b) {
    return (a-b);
  }

  @Override
  public int add(int a, int b) {
    return (a+b);
  }
}

Java中的嵌套接口

嵌套接口是声明为类或者其他接口的成员的接口。嵌套接口可以具有公共,私有,受保护或者默认访问权限,并且必须通过使用时在其中声明的类名或者接口进行限定。

class A{
  //nested interface
  interface MyInterface{
    int add(int a, int b);
  }
}

// Class implementing nested interface
class B implements A.MyInterface {
  @Override
  public int add(int a, int b) {
    return a+b;
  }
}

public class MainClass {
  public static void main(String[] args) {
    // Reference to nested interface
    A.MyInterface refObj = new B();
    int result = refObj.add(5, 6);
    System.out.println("Result- " + result);
  }
}

输出:

Result- 11