抽象類與抽象函式
阿新 • • 發佈:2019-02-16
1、概念
(1)抽象函式:只有函式定義,沒有函式體的函式。例如:
abstract void fun()
(2)抽象類(基類):使用abstract定義的類稱之為抽象類。記住:抽象類天生就是當爹的,要被繼承!
2、使用說明
(1)抽象類不能生成物件(假設可以生成物件,那麼可以呼叫裡面的抽象函式,而抽象類中若是有一個抽象 函式,其函式體為空,這樣便毫無意義);
(2)如果一個抽象類中含有一個抽象函式,那麼這個類必須宣告為抽象類;
(3)如果一個抽象類中沒有抽象函式,那麼這個類也可以宣告為抽象類(當不想讓其生成物件時,將其定義為抽象類即可)。
注意:抽象關鍵字不能和關鍵字final、private、static共存
- final:final修飾的類不能被繼承,而抽象類必須被繼承;
- private: 抽象父類中有private修飾的某抽象方法,繼承的子類中無法覆蓋該方法,而抽象類必須由其子類覆蓋掉所有的抽象方法後,其子類才可以進行例項化,否則,該子類還是一個抽象類。
- static: 抽象父類中有static修飾的某抽象方法,便可以通過“類名.該抽象方法”呼叫父類中的抽象方法,而呼叫抽象方法沒有意義!
【例1】抽象類的使用例項。
package com.chouxiang;
//定義一個抽象類
public abstract class Person {
String name;
int age;
Person(){
System.out.println("我是父類Person的建構函式");
}
//定義一個抽象方法
abstract void eat();
}
package com.chouxiang;
/*子類繼承了父類的屬性與方法,當然包括父類的抽象函式。
* 故而Chinese類應該為抽象類,應該在其前面加上abstract,這時子類不可以例項化。
*/
public class Chinese extends Person{
Chinese(){
System.out.println("我是子類Chinese的建構函式" );
}
//使用覆蓋的方式,在子類中複寫父類的抽象函式,這時就可以將子類變成非抽象類,子類便可以生成物件
void eat(){
System.out.println("用筷子吃飯!");
}
}
package com.chouxiang;
public class Test {
public static void main(String[] args) {
Person p=new Chinese();
p.eat();
}
}
執行結果:
結果分析:
通過執行結果可知,抽象類是可以有建構函式的!理論上,建構函式一般用於生成物件,而抽象類是不能生成物件的,所以,抽象類貌似不可以有建構函式。其實,我們忽略了一個重要的資訊,那就是,非抽象類子類繼承了抽象父類,非抽象子類中顯然可以有建構函式。呼叫子類的建構函式前必須前呼叫父類中建構函式,所以,抽象父類是可以有建構函式的!
3、抽象類的作用
在實際開發過程中,例如以上的程式碼,父類是一個抽象類,子類繼承了父類,父類中有一個抽象函式。如不想子類稱為抽象類,必須在子類中複寫父類中的抽象函式,否則,編譯將出錯,這樣可以防止我們在後期開發中出錯。
4、一般類和抽象類的異同
(1)相同之處:
一般類和抽象類都用於描述事物。
裡面都可以定義屬性和行為,以及建構函式。
(2)不同之處:
一般類中不可以定義抽象函式,抽象類可以。
一般類可以被例項化,抽象類不行。
一般類可以被繼承,也可以不被繼承,
抽象類一定要被繼承,需要其子類覆蓋所有的抽象方法子類才可以被例項化。