1.基本介紹
- 接口就是給出一些沒有實現(xiàn)的方法间驮,到某個類使用的時候,在根據(jù)具體情況吧這些方法寫出來
- 在jdk7.0前马昨,接口里的所有方法偶沒有方法體竞帽,即都是抽象方法
- jdk8.0以后扛施,接口可以有靜態(tài)方法、默認(rèn)方法屹篓,也就是說的接口中可以有方法的具體實現(xiàn)
2.注意事項和細(xì)節(jié)
- 接口不能被實例化
- 接口中所有的方法都是public方法疙渣,接口中的抽象方法,可以不用abstract修飾
- 一個普通類實現(xiàn)接口堆巧,就必須將接口中的所有方法都實現(xiàn)
- 抽象類實現(xiàn)接口妄荔, 可以不實現(xiàn)接口方法
- 一個類可以實現(xiàn)多個接口,例:class A implements B, C {}
- 接口中的屬性只能是final的谍肤,而且是 public static final 修飾, 必須初始化啦租。比如 int a = 1; 實際上是: public static final int a = 1;
- 接口可以直接訪問講臺屬性: 接口名.屬性名
- 接口不能繼承其他類,但是可以集成其他接口
- 接口的訪問修飾符只能是public和默認(rèn)荒揣,這點和類的修飾符一樣
- 在java中篷角,實現(xiàn)接口可以理解為是最類的單一繼承機制的一種補充
3.實現(xiàn)接口vs繼承類
- 接口和集成解決的問題不同:
繼承的主要價值在于: 解決代碼復(fù)用性和可維護性
接口的主要加載在于: 設(shè)計,設(shè)計好各種規(guī)范(方法)乳附,讓其他類去實現(xiàn)這些方法
- 接口比繼承更加靈活内地,繼承滿足的是is-a的關(guān)系,接口實現(xiàn)只需滿足like-a的關(guān)系
- 接口在一定程度上實現(xiàn)了代碼解耦
4.接口的多態(tài)
- 多態(tài)參數(shù)
class Computer {
// UsbInterface usbInterface 形參是接口類型 UsbInterface
public void work(UsbInterface usbInterface) {
usbInterface.start();
}
}
class Phone implements UsbInterface {
public void start() {
System.out.println("Phone start work...");
}
}
interface UsbInterface {
public void start();
}
class TextComputer {
public static void main(String[] args) {
Phone phone = new Phone();
Computer computer = new Computer();
computer.work(phone);
}
}
- 多態(tài)數(shù)組
class Phone implements UsbInterface {
public void call() {
System.out.println("Phone Phone...");
}
}
class Camera implements UsbInterface {
public void photoGraph() {
System.out.println("Camera photograph...");
}
}
interface UsbInterface {
}
class TextComputer {
public static void main(String[] args) {
UsbInterface[] usbInterfaces = new UsbInterface[2];
usbInterfaces[0] = new Phone();
usbInterfaces[1] = new Camera();
for (int i = 0; i < usbInterfaces.length; i++) {
if (usbInterfaces[i] instanceof Camera) {
// 向下轉(zhuǎn)型
((Camera) usbInterfaces[i]).photoGraph();
}
if (usbInterfaces[i] instanceof Phone) {
((Phone) usbInterfaces[i]).call();
}
}
}
}
- 接口存在多態(tài)傳遞現(xiàn)象
interface IH {}
interface IG extends IH {}
class Teacher implements IG {}
public class PolyPass {
public static void main(String[] args) {
// 接口類型的變量可以指向?qū)崿F(xiàn)了該接口的類的最想實例
IG ig = new Teacher();
// 如果IG集成了IH赋除,而Teacher實現(xiàn)了IG接口
// 那么, 實際就相當(dāng)于Teacher也實現(xiàn)了IH接口
// 這就是接口多態(tài)傳遞現(xiàn)象
IH ih = new Teacher();
}
}