接口指定对象必须提供的协议。类可以提供接口的抽象方法的部分实现,并且在这种情况下,类必须将自身声明为抽象。
实现接口的类使用“implements
”子句来指定接口的名称。“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; } }