首頁>Club>
2
回覆列表
  • 1 # 使用者4532147702961

    1.相同點

    A. 兩者都是抽象類,都不能例項化。

    B. interface實現類及abstrct class的子類都必須要實現已經宣告的抽象方法。

    2. 不同點

    A. interface需要實現,要用implements,而abstract class需要繼承,要用extends。

    B. 一個類可以實現多個interface,但一個類只能繼承一個abstract class。

    C. interface強調特定功能的實現,而abstract class強調所屬關係。

    D. 儘管interface實現類及abstrct class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是宣告的 (declaration, 沒有方法體),實現類必須要實現。而abstract class的子類可以有選擇地實現。

    這個選擇有兩點含義:

    一是Abastract class中並非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。

    二是abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以透過再次宣告其方法為抽象的方式,無需實現,留給其子類來實現,但此類必須也宣告為抽象類。既是抽象類,當然也不能例項化。

    E. abstract class是interface與Class的中介。

    interface是完全抽象的,只能宣告方法,而且只能宣告pulic的方法,不能宣告private及protected的方法,不能定義方法體,也 不能宣告例項變數。然而,interface卻可以宣告常量變數,並且在JDK中不難找出這種例子。但將常量變數放在interface中違背了其作為接 口的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應的abstract class或Class中。

    abstract class在interface及Class中起到了承上啟下的作用。一方面,abstract class是抽象的,可以宣告抽象方法,以規範子類必須實現的功能;另一方面,它又可以定義預設的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己 的例項變數,以供子類透過繼承來使用。

    3. interface的應用場合

    A. 類與類之前需要特定的介面進行協調,而不在乎其如何實現。

    B. 作為能夠實現特定功能的標識存在,也可以是什麼介面方法都沒有的純粹標識。

    C. 需要將一組類視為單一的類,而呼叫者只通過介面來與這組類發生聯絡。

    D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯絡。

    4. abstract class的應用場合

    一句話,在既需要統一的介面,又需要例項變數或預設的方法的情況下,就可以使用它。最常見的有:

    A. 定義了一組介面,但又不想強迫每個實現類都必須實現所有的介面。可以用abstract class定義一組方法體,甚至可以是空方法體,然後由子類選擇自己所感興趣的方法來覆蓋。

    B. 某些場合下,只靠純粹的介面不能滿足類與類之間的協調,還必需類中表示狀態的變數來區別不同的關係。abstract的中介作用可以很好地滿足這一點。

    C. 規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能。

    首先介面是一種高度抽象的"模版",,而介面中的屬性也就是’模版’的成員,就應當是所有實現"模版"的實現類的共有特性,所以它是public static的 ,是所有實現類共有的 .假如可以是非static的話,因一個類可以繼承多個介面,出現重名的變數,如何區分呢?

    其次,介面中如果可能定義非final的變數的話,而方法又都是abstract的,這就自相矛盾了,有可變成員變數但對應的方法卻無法操作這些變數,雖然可以直接修改這些靜態成員變數的值,但所有實現類對應的值都被修改了,這跟抽象類有何區別? 又介面是一種更高層面的抽象,

    是一種規範、功能定義的宣告,所有可變的東西都應該歸屬到實現類中,這樣接口才能起到標準化、規範化的作用。所以介面中的屬性必然是final的

  • 中秋節和大豐收的關聯?
  • 如何解決績效考核過程中遇到的難題和困惑?