在抽象類中,抽象方法本質上是定義接口規範:
即規定高層類的接口,從而保證所有子類都有相同的接口實現。
這樣,多態就能發揮出威力。如果一個抽象類沒有字段,所有方法全部都是抽象方法:
abstract class Person {
public abstract void run();
public abstract String getName();
}
就可以把該抽象類改寫爲接口:interface
。
在Java中,使用interface
可以聲明一個接口:
interface Person {
void run();
String getName();
}
所謂interface
,就是比抽象類還要抽象的純抽象接口,因爲它連字段都不能有。因爲接口定義的所有方法默認都是public abstract
的,所以這兩個修飾符不需要寫出來(寫不寫效果都一樣)。
當一個具體的class
去實現一個interface
時,需要使用implements
關鍵字。舉個例子:
class Student implements Person {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println(this.name + " run");
}
@Override
public String getName() {
return this.name;
}
}
我們知道,在Java中,一個類只能繼承自另一個類,不能從多個類繼承。但是,一個類可以實現多個interface
,例如:
class Student implements Person, Hello { // 實現了兩個interface
...
}
Java的接口特指
interface
的定義,表示一個接口類型和一組方法簽名,而編程接口泛指接口規範,如方法簽名,數據格式,網絡協議等。
抽象類和接口的對比如下:
abstract class | interface | ||
繼承 | 只能extends一個class | 可以implements多個interface | |
字段 | 可以定義實例字段 | 不能定義實例字段 | |
抽象方法 | 可以定義抽象方法 | 可以定義抽象方法 | |
非抽象方法 | 可以定義非抽象方法 | 可以定義default方法 |