1. 程式人生 > >【Java基本功】聊聊抽象類和介面的區別

【Java基本功】聊聊抽象類和介面的區別

1 抽象類一般會實現一部分操作,並且留一些抽象方法讓子類自己實現,比如Stringbuffer和Stringbuilder的父類abstractStringbuilder。

2 介面一般指一種規定,比如一個map介面中,可能需要實現增刪改查等功能,如果你想實現一個具體map,這些方法就必須按照規定去實現。

3 另外,一個類可以實現多個介面,但是不能繼承多個類。 然而介面卻可以繼承多個其他介面。這一點很神奇。

下面看一下具體的例子,有一些小細節平時可能不會注意。

  1. class A {

  2.  

  3. }

  4. interface M extends N,L{

  5.  

  6. }

  7. interface N{

  8.  

  9. }

  10. interface L{

  11.  

  12. }

  13. interface 介面 {

  14.    public final int i = 1;//變數預設都為public final修飾

  15.    final A a = null;//基本資料型別和引用都一樣

  16.    //protected void a();//報錯

  17.    //private //報錯

  18.    public abstract void a();// 方法都是public abstract修飾的。

  19.  

  20.    //void b(){} 報錯,接口裡的方法不能有方法體,也不能有{},只能有();

  21.  

  22.    // final void b();

  23.    // 注意,抽象方法不能加final。因為final方法不能被重寫。

  24.    //但如果抽象方法不被重寫那就沒有意義了,因為他根本沒有程式碼體。

  25.  

  26. }

  27. abstract class 抽象類 {

  28.    public final int i = 1;//變數並沒有被pulic和final修飾,只是一般的成員變數

  29.    public final A a = null;

  30.  

  31.    private void A(){}//抽象類可以有具體方法

  32.    abstract void AA();//抽象方法沒有方法體

  33.  

  34.    //private abstract void B();//報錯,組合非法

  35.    // 因為private修飾的方法無法被子類重寫,所以和final一樣,使抽象方法無法被實現。

  36.  

  37. }

  38.  

  39. //抽象類也可以被例項化,舉例說明

  40. abstract class B{

  41.    B() {

  42.        System.out.println("b init");

  43.    }

  44. }

  45.  

  46. class C extends B{

  47.    C(){

  48.        super();

  49.        System.out.println("c init");

  50.    }

  51. }

  52.  

  53. public class 介面對比抽象類 {

  54.    @Test

  55.    public void test() {

  56.        C c = new C();

  57.        //結果先例項化B,再例項化C。

  58.        //因為會呼叫到父類的構造方法。

  59.    }

  60. }