介面中這些細節你知道嗎?

一笨正經的小屁孩發表於2017-10-08

1.介面與類

我們知道Java本身提供了八種基本資料型別,分別為byte,short,int,long,boolean,float,double,char,只有這八種基本資料型別是遠遠不夠的,那麼Java中的類的概念就為我們大大擴大了資料型別的選擇,有了類,我們就可以自定義資料型別,任何我們想要的型別都可以。我們知道,Java中的類體現的是資料型別的概念,比如我們把動物歸成一類,然後動物這一類又可以細分為各種各樣的類(貓科動物,魚類等等)。但是有時候我們光分類並不利於我們解決問題,我們更多的是看重能力,比如拿燒水這件事來說,燒水是我們的目的,我們可以用電水壺燒水,也可以用煤氣灶燒水,還有可能我們用飲水機燒水等等,燒水的手段很多,在這裡,我們往往看重的是能力,某某裝置是否具有燒水這個能力,如果有,我們的目的就很容易達到了,所以,Java中介面的概念就類似於上面燒水的例子,強調的是能力。

2.使用介面的好處

  • 使用介面我們更容易統一處理;我們可以用介面型別的變數去引用實現了介面能力的子類物件,子類物件實現的細節我們不需要知道,我們往往只需要知道介面中提供的這個方法所要解決的問題是什麼,也就是具備什麼樣的能力,因此,我們大多數時候就可以面向介面程式設計,比如說在程式碼的某一處集中操作介面中的方法就可以了,然而實際上在程式碼真正的執行過程中執行的是實現了介面能力的子類物件中的程式碼邏輯(多型和動態繫結)。
  • 降低耦合;降低耦合是使用介面最直接的好處,當我們定義好規範的介面之後,我們只需要面向介面程式設計(這條跟上面這條其實很相似),通過多型和動態繫結來達到鬆耦合的目的,只要介面規範不變動,具體的實現細節我們可以隨意改動,並且對使用者來說,這些都是不可見的,使用者往往關注的是是否具有某種能力,具體實現這種能力的邏輯不是他該關心的事兒。因此,使用介面的靈活性更大。

3.使用介面的注意事項

  • 介面中的變數

    public interface Run{
      public static final float speed = 50f;
      ...
    }複製程式碼

    其實上面這種寫法和下面這種寫法其實是相同的。

    public interface Run{
      float speed = 50f;
      ...
    }複製程式碼

    如果變數不寫public static final系統在預設情況下也是public static final的。這樣,我們就可以跟使用類中靜態變數的形式一樣使用它Run.speed

  • 介面中的方法

    public interface Run{
      public void run1();
      protected void run2();
      void run3();
      public abstract void run4();
    }複製程式碼

    像上面四種方法的寫法哪一種是錯誤的呢,當然了,明眼人一眼就能看出是第二個方法,也就是protected修飾的方法,第一個方法,第三個方法以及第四個方法的寫法其實是一樣的,在介面中,在宣告方法時即使不加訪問修飾符,預設情況下就是public abstract的,因此,寫與不寫其實是一樣的,有些IDE中,如果你寫了public或者public abstract,public或者poublic abstract並不是高亮的,而是灰色的,對於我這種程式碼潔癖的人來說,並不能忍,看到了直接刪掉,當然了,這只是我個人的喜好,大家可以不用效仿我。

  • 介面的繼承

    public interface Run extend Walk,RaceWalk{
      ...
    }複製程式碼

    介面繼承和類繼承不一樣,類繼承只能實現單繼承,也就是一個類只能有一個父類,而介面不是,介面可以同時繼承多個介面,那麼問題來了,可能會有人問,介面可以繼承類嗎,可以繼承多個類嗎,我想說的是“孩子,你真的需要去補一補Java基礎了”。

4.總結

好了,介面就扯這麼多,沒有說的很全,只是提一下介面的要點以及使用過程中需要注意的點,當然了,如何把介面使用的“出神入化”是一門硬功夫,需要慢慢的修煉,由於本人能力的限制,這裡就暫且介紹這麼多,對於本文內容如有不當之處歡迎各位大佬糾錯指正,謝謝!

相關文章