接口指定對象必須提供的協(xié)議。類可以提供接口的抽象方法的部分實(shí)現(xiàn),并且在這種情況下,類必須將自身聲明為抽象。
實(shí)現(xiàn)接口的類使用“implements
”子句來指定接口的名稱。“implements
”子句由關(guān)鍵字implements
,后跟逗號分隔的接口類型列表組成。
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。實(shí)現(xiàn)接口的類聲明的一般語法如下:
<modifiers> class <class-Name> implements <comma-separated-list-of-interfaces> {
// Class body goes here
}
假設(shè)有一個(gè)Circle
類。
public class Circle implements Shape {
void draw(){
System.out.println("draw circle");
}
}
實(shí)現(xiàn)接口的類必須重寫以實(shí)現(xiàn)接口中聲明的所有抽象方法。 否則,類必須聲明為abstract
。接口的默認(rèn)方法也由實(shí)現(xiàn)類繼承。植入類可以選擇不需要重寫默認(rèn)方法。接口中的靜態(tài)方法不會(huì)被實(shí)現(xiàn)類繼承。
下面的代碼定義了兩種引用類型,一種來自Circle
類,另一種來自接口類型。
Circle c = new Circle();
Shape shape = new Circle();
變量c
是Circle
類型。它指的是Circle
對象。第二個(gè)賦值也是有效的,因?yàn)?code>Circle類實(shí)現(xiàn)了Shape
接口,而Circle
類的每個(gè)對象也都是Shape
類型。
當(dāng)一個(gè)類完全實(shí)現(xiàn)了一個(gè)接口時(shí),它為所實(shí)現(xiàn)的接口的所有抽象方法提供一個(gè)實(shí)現(xiàn)。接口中的方法聲明包括方法的約束。例如,方法聲明中的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
子句。當(dāng)類覆蓋接口方法時(shí),允許刪除約束異常。如果使用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);
}
}
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。類實(shí)現(xiàn)的所有接口都在類聲明中的關(guān)鍵字implements
之后列出。
通過實(shí)現(xiàn)多個(gè)接口,類為所有接口中的所有抽象方法提供實(shí)現(xiàn)。
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;
}
}
類不必為所有方法提供實(shí)現(xiàn)。如果一個(gè)類不提供接口的完全實(shí)現(xiàn),它必須聲明為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;
}
}