介面方法聲明
可以在介面中聲明三種類型的方法:
- 抽象方法
- 靜態方法
- 默認方法
在Java 8之前,只能在介面中聲明抽象方法。 修飾符static
和default
用於分別聲明靜態和默認方法。
不使用static
和default
修飾符就是方法抽象。
以下是具有所有三種類型方法的介面的示例:
interface AnInterface {
// An abstract method
int m1();
// A static method
static int m2() {
// The method implementation goes here
}
// A default method
default int m3() {
// The method implementation goes here
}
}
抽象方法聲明
介面中的所有方法聲明都是隱式抽象和公開的,除非它們聲明為static
或default
。介面中的抽象方法沒有實現。抽象方法的主體總是由分號表示,而不是一對大括弧。
下麵的代碼聲明一個名為Player
的介面:
public interface Player {
public abstract void play();
public abstract void stop();
public abstract void forward();
public abstract void rewind();
}
Player
介面是音頻/視頻播放器的規範。真實的播放器,例如DVD
播放器,將通過實現 Player
介面的所有四個方法來提供規範的具體實現。
在介面中使用 abstract
和 public
關鍵字聲明方法中是多餘的。上面的Player
介面的聲明可以改寫如下,而不改變其含義:
public interface Player {
void play();
void stop();
void forward();
void rewind();
}
介面中的抽象方法聲明可以包括參數,返回類型和throws
子句。
public interface NewPlayer {
boolean play(int account) throws AccountNotFoundException;
boolean stop(double amount);
boolean forward(double amount) throws InsufficientBalanceException;
double rewind();
}
介面的抽象方法由實現介面的類來實現,類重寫它們以提供方法並實現。介面中的抽象方法不能聲明為final
。
類可以重寫聲明介面的方法為final
,指示子類不能覆蓋該方法。
靜態方法聲明
從Java 8,我們可以在介面中創建靜態方法。靜態方法包含靜態修飾符- static
,並且是隱式公開的。可以重新定義Walkable
介面以包括letThemWalk()
方法。
interface Walkable {
// An abstract method
void walk();
// A static convenience method
public static void letThemWalk(Walkable[] list) {
for (int i = 0; i < list.length; i++) {
list[i].walk();
}
}
}
可以使用點表示法使用介面的靜態方法。如下代碼 -
<interface-name>.<static-method>
與類中的靜態方法不同,介面中的靜態方法不能通過實現類或子介面來繼承。從另一個介面繼承的介面稱為子介面。 只有一種方法來調用介面的靜態方法:使用介面名稱。例如:
必須使用MyInterface.myStaticMethod()
調用介面MyInterface
的靜態方法myStaticMethod()
。
可以使用方法的非限定名稱myStaticMethod()
來調用它,這僅在介面的主體中,或者當使用靜態import
語句導入方法時可這樣使用。
默認方法聲明
介面中的默認方法使用修辭符-default
來聲明。默認方法是在Java 8中添加新功能。默認方法為實現介面的類提供了一個默認實現,但不覆蓋默認方法。
假設,有以下的一個介面。
interface Shape{
void setX(double x);
void setY(double y);
double getX();
double getY();
}
下麵的代碼顯示了 Circle
類實現了 Shape
介面。
class Circle implements Movable {
private double x;
private double y;
public Circle() {
}
public Circle(double x, double y) {
this.x = x;
this.y = y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public String toString() {
return "Circle(" + x + ", " + y + ")";
}
}
如果向Shape
添加一個新方法如下。
interface Shape {
void setX(double x);
void setY(double y);
double getX();
double getY();
void move(double deltaX, double deltaY);
}
在Java 8之前,新方法move()
是一個抽象方法。 所有實現Shape
介面的類都必須提供這個新方法的實現。
實現Shape
介面的Pen
類將不能通過編譯,除非將新方法添加實現到這些類中。在Java 8之前,在將介面分配給公共介面之後,在中斷實現介面方法代碼的情況下,向介面添加方法是不可能的。
所以,引入了Java介面默認方法這個解決方案。可以將默認方法添加到現有介面,並為該方法提供默認實現而不用在實現介面的類中實現這個默認方法。
所有實現介面的類都將繼承默認實現。類可以選擇覆蓋默認實現或使用方法的默認實現。
默認方法使用關鍵字default
聲明。 默認方法不能聲明為abstract
或static
。 它必須提供一個實現。 否則將在編譯時發生錯誤。
以下代碼使用默認方法更改Shape
介面。
interface Movable {
void setX(double x);
void setY(double y);
double getX();
double getY();
// 一個默認的方法
default void move(double deltaX, double deltaY) {
double newX = getX() + deltaX;
double newY = getY() + deltaY;
setX(newX);
setY(newY);
}
}
以下專案列出了類方法和介面默認方法之間的相似點和差異。
- 兩者都可以以相同的方式訪問關鍵字
this
。 關鍵字this
是調用方法的對象的引用。 - 類一個具體方法可以訪問類的實例變數。
- 默認方法不能訪問實現介面的類的變數的實例。
- 默認方法可以訪問介面的其他成員。
- 兩種類型的方法都可以使用它們的參數。
- 兩個方法都可以有一個
throws
子句。 - 介面中的嵌套類型聲明定義了一個新的引用類型。
- 可以將一個類,介面,枚舉和注釋聲明為嵌套類型。
- 在介面內聲明的介面/類稱為嵌套介面/類。
- 介面和類定義新的引用類型,因此做嵌套介面和嵌套類。
- 嵌套介面始終通過其封裝介面訪問。
- 可以在介面中聲明一個嵌套類。
參考以下一個具有嵌套類和常量字段的Task
介面。
interface Task {
class EmptyTask implements Task {
private EmptyTask() {
}
public void runJob() {
System.out.println("Empty...");
}
}
// A constant field
Task EMPTY_JOB = new EmptyTask();
void runJob();
}
public class Main {
public static void main(String[] args) {
submitJob(Task.EMPTY_JOB);
}
public static void submitJob(Task job) {
job.runJob();
}
}
Java介面方法 # Java_interface_Methods