【Java基本功】聊聊抽象類和介面的區別
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。
-
//因為會呼叫到父類的構造方法。
-
}
-
}