介面指定物件必須提供的協定。類可以提供介面的抽象方法的部分實現,並且在這種情況下,類必須將自身宣告為抽象。
實現介面的類使用「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;
}
}