從頭認識java-7.2 介面
這一章節我們來討論一下介面。
之前我們已經聊過抽象類別,他已經進行了第一步的抽象,把某些方法抽象出來,然後在子類那裡實現,但他不是完全抽象。
而介面,就是進一步抽象,它裡面全是沒有實現的方法,所以的方法都在實作類別裡面實現。
1.概念
介面:就像類與類之間的一種協議,只需要知道某個類實現的某個介面, 那麼,他就可以通過調用介面裡面的方法來指向這個類的實現。
2.特性
(1)使用interface標註
(2)完全抽象
(3)屬性域必須是public final static(這個是編譯器自動轉換的)
(4)方法必須是public
(5)向上轉型,為父類指向子類對象提供途徑,同時也使得java擁有多態這個特性
(6)不可以執行個體化
(7)介面可以多重實現
interface Instrument {int id=0;void Play();}
3.執行個體
package com.ray.ch07;public class Test {public void tune(Instrument instrument) {instrument.Play();}public void tune(Instrument[] instruments) {for (int i = 0; i < instruments.length; i++) {tune(instruments[i]);}}public static void main(String[] args) {Test test = new Test();// Instrument instrument = new Instrument();//errorInstrument wind = new Wind();Instrument bass = new Bass();Instrument[] instruments = { wind, bass };test.tune(instruments);System.out.println(Instrument.id);// id是static}}interface Instrument {// private int id=0;//error// private void Play();//errorint id = 0;void Play();}class Wind implements Instrument {@Overridepublic void Play() {// id=2;//The final field Instrument.id cannot be assignedSystem.out.println(id);System.out.println(wind play);}}class Bass implements Instrument {@Overridepublic void Play() {System.out.println(bass play);}}
輸出:
0
wind play
bass play
0
從上面的代碼可以看見:
1.介面是不可以new 的
2.子類必須實現介面的方法
3.通過向上轉型,以Instrument為類型定義的wind和bass,也可以調用play方法,而且運行時自動識別應該綁定那個play方法
4.由於wind和bass必須重寫play,因此play一定是public,因為wind和bass不是繼承Instrument
5.我們通過列印Instrument裡面的id,知道id一定是static,因為可以直接使用Instrument調用,而不需要new
6.通過在實作類別wind裡面修改id,就可以看到他的提示,提示id是final的。
7.介面的多重實現我們將在後面講述。
總結:這一章節主要討論了介面的概念、特性,以及舉例來說明這些特性。