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

【Java基本功】聊聊抽象類和接口的區別

uil 可能 extends system alt public java 如果 private

技術分享圖片

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

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

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

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

  1. class A {

  2. }

  3. interface M extends N,L{

  4. }

  5. interface N{

  6. }

  7. interface L{

  8. }

  9. interface 接口 {

  10. public final int i = 1;//變量默認都為public final修飾

  11. final A a = null;//基本數據類型和引用都一樣

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

  13. //private //報錯

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

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

  16. // final void b();

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

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

  19. }

  20. abstract class 抽象類 {

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

  22. public final A a = null;

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

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

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

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

  27. }

  28. //抽象類也可以被實例化,舉例說明

  29. abstract class B{

  30. B() {

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

  32. }

  33. }

  34. class C extends B{

  35. C(){

  36. super();

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

  38. }

  39. }

  40. public class 接口對比抽象類 {

  41. @Test

  42. public void test() {

  43. C c = new C();

  44. //結果先實例化B,再實例化C。

  45. //因為會調用到父類的構造方法。

  46. }

  47. }

技術分享圖片

【Java基本功】聊聊抽象類和接口的區別