### 一.抽象類 定義上來看,被abstract關鍵字修飾的類稱為抽象類。被abstract關鍵字修飾的方法稱為抽象方法。當父類的某些方法,需要聲明,但是又不確定如何實現時,可以將其聲明為抽象方法,那麼這個類就是抽象類.例: ``` [public|protected] abstract clas ...
一.抽象類
定義上來看,被abstract關鍵字修飾的類稱為抽象類。被abstract關鍵字修飾的方法稱為抽象方法。當父類的某些方法,需要聲明,但是又不確定如何實現時,可以將其聲明為抽象方法,那麼這個類就是抽象類.例:
[public|protected] abstract class T {
String name;
int age;
abstract public void test();
}
特征:
- 抽象類不可以實例化,可以被繼承,可以看作是對類的進一步抽象,可以繼承普通類或者抽象類
- 抽象類是它的所有子類的公共屬性的集合,可包含多個抽象方法,也可以沒有抽象方法
- 抽象類多用於設計,讓子類繼承並實現抽象類,用來創建繼承層級裡子類的模板
- 抽象類可以包含屬性、方法、構造方法,但是構造方法不能用於實例化
- 子類繼承抽象類,必須實現抽象類的所有抽象方法,或者將子類設置成抽象類
- 只要包含一個抽象方法的類必須要定義成抽象類
- 抽象類中的抽象方法只有方法的聲明,只是起到一個限制的作用,並沒有提供實際的方法體,這也要求子類去實現自己的方法體
- abstract關鍵字只能修飾類和方法
- 抽象方法不可以用private、static、final來修飾,與重寫相違背
二.介面
定義上來看,介面使用interface關鍵字修飾。介面就是給出一些無法實現的方法,封裝在一起,到某個類要使用的時候,根據情況重新寫出來。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。例:
interface IAI{
String name="Jack";
int age=12;
default void iac(){
System.out.println(1);
};
static void iab(){
System.out.println(2);
}
}
class TA implements IAI{
public static void main(String[] args) {
IAI iai=new TA();
iai.iac(); //1
IAI.iab(); //2
}
}
特征:
- 介面不可以實例化
- 介面中所有的方法都是public方法,介面的抽象方法可以不用abstract修飾
- 實現介面的子類必須實現所有的抽象方法,除非是抽象類
- 介面可以被介面繼承,或者被其他類實現
- 一個類可以實現多個介面,子類通過implements關鍵字來實現
- 介面中的屬性必須是final的,而且隱含的是public static final修飾符,必須顯示的初始化
- 介面屬性的訪問形式:介面名.屬性名,介面的static修飾的方法訪問形式:介面名.方法名
- 介面方法必須用static或者default修飾詞修飾
三.區別
相同:
- 都不能被實例化
- 介面的實現類或抽象類的子類都只有實現了介面或抽象類中的方法後才能實例化
- 抽象類和介面都是用來抽象具體對象的,要面向介面(抽象)編程,而不要面向具體編程。雖然都進行了不同程度的抽象,但是介面的抽象級別最高
不同:
- 抽象類是對類抽象,而介面是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類局部(行為)進行抽象
- 抽象類是自底向上抽象而來的,介面是自頂向下設計出來的
- 抽象類要被子類繼承,而介面是用來被子類實現的
- 介面只能做方法聲明,不能有方法的實現,抽象類中不僅可以作方法聲明,也可以做方法實現
- 實現介面的關鍵字為implements,繼承抽象類的關鍵字為extends。一個類可以實現多個介面,但一個類只能繼承一個抽象類。對於java的單繼承的一種補充
- 抽象類有構造器,介面沒有構造器,只能重寫方法