Java 接口实现

Java面向对象设计 - Java接口实现

实现接口

接口指定对象必须提供的协议。

类可以提供接口的抽象方法的部分实现,并且在这种情况下,类必须将自身声明为抽象。

实现接口的类使用“implements”子句来指定接口的名称。

“实现”子句由关键字implements,后跟逗号分隔的接口类型列表组成。

一个类可以实现多个接口。

实现接口的类声明的一般语法如下:

<modifiers> class  <class-Name>  implements <comma-separated-list-of-interfaces>  {
    // Class body  goes  here
}

假设有一个Circle类。

public class Circle implements Shape {
   void  draw(){
      System.out.println("draw circle");
   }
}

实现接口的类必须重写以实现接口中声明的所有抽象方法。否则,类必须声明为abstract。

接口的默认方法也由实现类继承。

植入类可以选择不需要重写默认方法。

接口中的静态方法不会被实现类继承。

下面的代码定义了两种引用类型,一种来自Circle类,另一种来自接口类型。

Circle c = new Circle(); 
Shape shape = new Circle();

变量c是Circle类型。它指的是Circle对象。

第二个赋值也是有效的,因为Circle类实现了Shape接口,而Circle类的每个对象也都是Shape类型。


实现接口方法

当一个类完全实现了一个接口时,它为所实现的接口的所有抽象方法提供一个实现。

接口中的方法声明包括方法的约束。例如,方法声明中的throws子句是​​方法的约束。

import java.io.IOException;
interface Shape {
  void draw(double amount) throws IOException;
}
class Main implements Shape{

  @Override
  public void draw(double amount) {
    // TODO Auto-generated method stub
  }  
}

Main的代码是有效的,即使它丢弃了throws子句。当类覆盖接口方法时,允许删除约束异常。

如果我们使用Shape类型,我们必须处理IOException。

import java.io.IOException;

interface Shape {
  void draw(double amount) throws IOException;
}
class Main implements Shape{

  @Override
  public void draw(double amount) {
    // TODO Auto-generated method stub
    
  }
  public void anotherMethod(){
    Shape s = new Main();
    try {
      s.draw(0);
    } catch (IOException e) {
      e.printStackTrace();
    }
    draw(0); 
  }
}

实现多个接口

一个类可以实现多个接口。类实现的所有接口都在类声明中的关键字implements之后列出。

通过实现多个接口,类同意为所有接口中的所有抽象方法提供实现。

interface Adder {
  int add(int n1, int n2);
}
interface Subtractor {
  int subtract(int n1, int n2);
}
class Main implements Adder, Subtractor {
  public int add(int n1, int n2) {
    return n1 + n2;
  }
  public int subtract(int n1, int n2) {
    return n1 - n2;
  }
}

部分实现接口

类不必为所有方法提供实现。

如果一个类不提供接口的完全实现,它必须声明为abstract。

interface Calculator {
  int add(int n1, int n2);

  int subtract(int n1, int n2);
}
abstract class Main implements Calculator{
  public int add(int n1, int n2) {
    return n1 + n2;
  }
}