Java接口教程

Java接口教程

Java接口教程

 接口是什么?

Java中的接口定义了一个引用类型来创建抽象概念。 接口由类实现,它是用来提供概念的实现。

在Java 8之前,一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。

接口通过抽象概念定义不相关类之间的关系。例如,可以创建一个Person类来表示一个人,也可以创建一个Dog类来表示一只狗。

人和狗都可以走路。 这里的走路是一个抽象的概念。 狗可以走路,人也是走路。这里可以创建一个名为Walkable的接口来表示走路这个概念。然后在Person类和Dog类中各自实现Walkable概念(如:实现怎么走路)。 Person类实现了Walkable接口以人的方式走路(如:用两条腿走路)。 Dog类可以实现Walkable接口以狗的方式走路(如:用四条腿走路)。

示例-1

下面将使用一个例子来说明为什么需要接口。
假设Person类有一个walk()方法。
在相同的包下创建一个接口文件 - Walkable.java 并使用以下代码 -

public interface Walkable {
  void walk(); // 接口中只有一个方法
}

在相同的包下创建一个主类 -Main.java 并使用以下代码 -


class Person implements Walkable {
    public Person() {
    }

    public void walk() {
        System.out.println("人走路:使用两条腿足路.");
    }
}

class Dog implements Walkable {
    public Dog() {
    }

    public void walk() {
        System.out.println("狗走路:使用四条腿足路.");
    }
}

public class Main {
    public static void main(String[] args) {
        Walkable[] w = new Walkable[2];
        w[0] = new Person();
        w[1] = new Dog();
        w[0].walk();
        w[1].walk();
        // 或者
        // Person p = new Person();
        // p.walk();
    }
}

上面的代码输出结果如下 -

人走路:使用两条腿足路.
狗走路:使用四条腿足路.

类可以在其声明中使用关键字implements实现一个或多个接口。通过实现一个接口,类保证它将为接口中声明的所有方法提供一个实现,或者类将自己声明为抽象。
如果一个类实现了Walkable接口,它必须提供walk()方法的具体实现。

像类一样,接口定义了一个新的引用类型。当定义一个新的接口(例如,Walkable)时,定义一个新的参考接口类型。
以下声明有效:

Walkable  w;  // w  is a  reference variable of  type   Walkable

但是不能创建接口类型的对象,因为接口是定义抽象概念。 以下代码无效,编译会出错:

new Walkable(); // A  compile-time error

只能为类类型创建对象,但是可以使用一个接口类型变量来引用那些类实现该接口的任何对象。
如:PersonDog类都实现了Walkable接口,所以Walkable类型的引用变量可以引用这两个类的对象。如下代码是没有问题的:

Walkable  w1  = new Person(); // OK 
Walkable  w2  = new Dog();     // OK

可以使用它的引用类型变量访问接口的任何成员。 由于Walkable接口只有一个成员,也就是walk()方法,所以这里可以编写如下代码:

// Let  the   person  walk 
w1.walk();
// Let  the   dog walk 
w2.walk();

当调用w1walk()方法时,它调用Person对象的walk()方法,因为w1指的是Person对象。当调用w2walk()方法时,它调用Dog对象的walk()方法,因为w2指的是Dog对象。

当使用接口类型的引用变量调用方法时,它将调用它所引用的对象的方法。

实例-2

下面的代码创建了一个方法来使用接口参数类型。

public class Main{
  public static void main(String[] args) {
    Walkable[] w = new Walkable[2];
    w[0] = new Person();
    w[1] = new Dog();

    Walkables.letThemWalk(w);
  }
}

class Walkables {
  public static void letThemWalk(Walkable[] list) {
    for (Walkable w : list) {
      w.walk();
    }
  }
}

声明接口

声明接口的一般语法是 -

<modifiers> interface <interface-name>  { 
    Constant-Declaration
    Method-Declaration
    Nested-Type-Declaration
}

接口声明以修饰符列表开头,也可以为空(不写)。像类一样,一个接口可以有一个公共或包级别的范围。
关键字public用于指示接口具有公共范围。缺少范围(不使用)修饰符表示接口具有包级别作用域。 具有包级别作用域的接口只能在其包的成员内引用。
关键字interface用于声明接口,后面是接口的名称。

接口的名称必须是有效的Java标识符。接口主体跟在其名称后面并放在大括号内。接口的主体可以为空。 以下是最简单的接口声明:

package com.zyiz;

interface Updatable  {
    // The interface body  is empty
}

像类一样,一个接口有一个简单的名称和一个完全限定名。关键字interface后面的标识符是其简单名称。接口的完全限定名称通过使用其包名称和用点分隔的简单名称组成。

在上面的示例中,Updatable是简单的名称,com.zyiz.Updatable是完全限定名称。使用接口的简单和完全限定名的规则与类的规则相同。
下面的代码声明一个名为ReadOnly的接口。 它有一个公共(public)范围。

package  com.zyiz;

public interface  ReadOnly {
    // The interface body  is empty
}

接口声明总是抽象的,无论是否明确声明它为抽象。

标记接口

标记接口是没有成员的接口。标记接口用来标记类具有特殊含义。

interface  Shape {
}
class Circle implements Shape{
}

Shape c = new Circle();

if (c instanceof Shape)  {
   System.out.println("Using a  Shape object");
}

Java API有许多标记接口。如:java.lang.Cloneablejava.io.Serializablejava.rmi.Remote都是标记接口。

功能接口

仅具有一个抽象方法的接口被称为功能接口。

多态性 - 一个对象,许多视图

多态性是指对象具有多种形式的能力。多态性是对象提供其不同视图的能力。使用接口使得我们可以创建一个多态对象。