重走Java基礎:面向物件-抽象類(abstract)
阿新 • • 發佈:2018-11-17
抽象類,什麼是抽象類?
1. 抽象類的產生
當編寫一個類時,我們往往會為該類定義一些方法,這些方法是用來描述該類的功能具體實現方式,那麼這些方法都有具體的方法體。
但是有的時候,某個父類只是知道子類應該包含怎麼樣的方法,但是無法準確知道子類如何實現這些方法。比如一個圖形類應該有一個求周長的方法,但是不同的圖形求周長的演算法不一樣。那該怎麼辦呢?**
分析事物時,發現了共性內容,就出現向上抽取。會有這樣一種特殊情況,就是方法**功能宣告相同,但方法功能主體不同。那麼這時也可以抽取,但只抽取方法宣告,不抽取方法主體。那麼此方法就是一個抽象方法。**
比如:
描述JavaEE工程師:行為:工作。
描述Android工程師:行為:工作。
**JavaEE工程師和Android工程師之間有共性,可以進行向上抽取。**抽取它們的所屬共性型別:研發部員工。由於JavaEE工程師和Android工程師都具有工作功能,但是他們具體工作內容卻不一樣。這時在描述研發部員工時,發現了有些功能(工作)不具體,這些不具體的功能,需要在類中標識出來,通過java中的關鍵字abstract(抽象)。
當定義了抽象函式的類也必須被abstract關鍵字修飾,被abstract關鍵字修飾的類是抽象類。
2. 抽象類&抽象方法的定義
抽象方法定義的格式:
public abstract 返回值型別 方法名(引數);
看如下程式碼:
//研發部員工 abstract class Developer { public abstract void work();//抽象函式。需要abstract修飾,並分號;結束 } //JavaEE工程師 class JavaEE extends Developer{ public void work() { System.out.println("正在研發淘寶網站"); } } //Android工程師 class Android extends Developer { public void work() { System.out.println("正在研發淘寶手機客戶端軟體"); } }
3.抽象類的特點
看以下程式碼:
Develop類
/*
* 定義類開發工程師類
* EE開發工程師 : 工作
* Android開發工程師 : 工作
*
* 根據共性進行抽取,然後形成一個父類Develop
* 定義方法,工作: 怎麼工作,具體幹什麼呀
*
* 抽象類,不能例項化物件, 不能new的
* 不能建立物件的原因: 如果真的讓你new了, 物件.呼叫抽象方法,抽象方法沒有主體,根本就不能執行
* 抽象類使用: 定義類繼承抽象類,將抽象方法進行重寫,建立子類的物件
*/
public abstract class Develop {
//定義方法工作方法,但是怎麼工作,說不清楚了,講不明白
//就不說, 方法沒有主體的方法,必須使用關鍵字abstract修飾
//抽象的方法,必須存在於抽象的類中,類也必須用abstract修飾
public abstract void work();
}
JavaEE類
/*
* 定義類,JavaEE的開發人員
* 繼承抽象類Develop,重寫抽象的方法
*/
public class JavaEE extends Develop{
//重寫父類的抽象方法
//去掉abstract修飾符,加上方法主體
public void work(){
System.out.println("JavaEE工程師在開發B/S 軟體");
}
}
Android類
/*
* 定義Android類,繼承開發人員類
* 重寫抽象方法
*/
public class Android extends Develop{
public void work(){
System.out.println("Android工程師開發手機軟體");
}
}
Test測試類
/*
* 測試抽象類
* 建立他的子類的物件,使用子類的物件呼叫方法
*/
public class Test {
public static void main(String[] args) {
JavaEE ee = new JavaEE();
ee.work();
Android and = new Android();
and.work();
}
}
- 抽象類和抽象方法都需要被abstract修飾。抽象方法一定要定義在抽象類中。
- 抽象方法只能有宣告;沒有大括號囊括的
- 抽象類不可以直接建立物件,原因:呼叫抽象方法沒有意義。
- 抽象類的使用必須通過子類來使用,並且只有覆蓋了抽象類中所有的抽象方法後,其子類才可以建立物件。否則該子類還是一個抽象類,因為子類繼承了所有父類屬性和方法,如果子類裡不將父類的所有抽象方法重寫,那麼子類裡還存在從父類繼承過來的抽象方法,因此子類存在抽象方法,所有子類也應該是抽象類。無法new一個子類例項。
- 設計思想: 之所以繼承抽象類,更多的是在思想,是面對共性型別操作會更簡單。抽象類的作用:繼承體系。抽象類,強制子類重寫抽象方法。
4. 抽象類的細節問題
- 抽象類一定是個父類?
是的,因為不斷抽取而來的。 - 抽象類中是否可以不定義抽象方法。
是可以的,那這個抽象類的存在到底有什麼意義呢?不讓該類建立物件,方法可以直接讓子類去使用。
/*
* 抽象類,可以沒有抽象方法,可以定義帶有方法體的方法
* 讓子類繼承後,可以直接使用
*/
public abstract class Animal {
public void sleep(){
System.out.println("動物睡覺");
}
// private abstract void show();
//抽象方法,需要子類重寫, 如果父類方法是私有的,子類繼承不了,也就沒有了重寫
}
public class Cat extends Animal{
}
public class Test {
public static void main(String[] args) {
//Cat c = new Cat();
new Cat().sleep();
}
}
- 抽象關鍵字abstract不可以和哪些關鍵字共存?
-
- private:私有的方法子類是無法繼承到的,也不存在覆蓋,而abstract和private一起使用修飾方法,abstract既要子類去實現這個方法,而private修飾子類根本無法得到父類這個方法。互相矛盾。
-
- final
-
- static