【Java基本功】聊聊抽象類和接口的區別
- 2019 年 10 月 7 日
- 筆記
1 抽象類一般會實現一部分操作,並且留一些抽象方法讓子類自己實現,比如Stringbuffer和Stringbuilder的父類abstractStringbuilder。 2 接口一般指一種規定,比如一個map接口中,可能需要實現增刪改查等功能,如果你想實現一個具體map,這些方法就必須按照規定去實現。 3 另外,一個類可以實現多個接口,但是不能繼承多個類。 然而接口卻可以繼承多個其他接口。這一點很神奇。
下面看一下具體的例子,有一些小細節平時可能不會注意。
class A { } interface M extends N,L{ } interface N{ } interface L{ } interface 接口 { public final int i = 1;//變量默認都為public final修飾 final A a = null;//基本數據類型和引用都一樣 //protected void a();//報錯 //private //報錯 public abstract void a();// 方法都是public abstract修飾的。 //void b(){} 報錯,接口裡的方法不能有方法體,也不能有{},只能有(); // final void b(); // 注意,抽象方法不能加final。因為final方法不能被重寫。 //但如果抽象方法不被重寫那就沒有意義了,因為他根本沒有代碼體。 } abstract class 抽象類 { public final int i = 1;//變量並沒有被pulic和final修飾,只是一般的成員變量 public final A a = null; private void A(){}//抽象類可以有具體方法 abstract void AA();//抽象方法沒有方法體 //private abstract void B();//報錯,組合非法 // 因為private修飾的方法無法被子類重寫,所以和final一樣,使抽象方法無法被實現。 } //抽象類也可以被實例化,舉例說明 abstract class B{ B() { System.out.println("b init"); } } class C extends B{ C(){ super(); System.out.println("c init"); } } public class 接口對比抽象類 { @Test public void test() { C c = new C(); //結果先實例化B,再實例化C。 //因為會調用到父類的構造方法。 } }