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; } }