1. 程式人生 > >重走Java基礎:面向物件-抽象類(abstract)

重走Java基礎:面向物件-抽象類(abstract)

抽象類,什麼是抽象類?

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();
	}
}

  1. 抽象類和抽象方法都需要被abstract修飾。抽象方法一定要定義在抽象類中。
  2. 抽象方法只能有宣告;沒有大括號囊括的
  3. 抽象類不可以直接建立物件,原因:呼叫抽象方法沒有意義。
  4. 抽象類的使用必須通過子類來使用,並且只有覆蓋了抽象類中所有的抽象方法後,其子類才可以建立物件。否則該子類還是一個抽象類,因為子類繼承了所有父類屬性和方法,如果子類裡不將父類的所有抽象方法重寫,那麼子類裡還存在從父類繼承過來的抽象方法,因此子類存在抽象方法,所有子類也應該是抽象類。無法new一個子類例項。
    在這裡插入圖片描述
  5. 設計思想: 之所以繼承抽象類,更多的是在思想,是面對共性型別操作會更簡單。抽象類的作用:繼承體系。抽象類,強制子類重寫抽象方法。

4. 抽象類的細節問題

  1. 抽象類一定是個父類?
    是的,因為不斷抽取而來的。
  2. 抽象類中是否可以不定義抽象方法。
    是可以的,那這個抽象類的存在到底有什麼意義呢?不讓該類建立物件,方法可以直接讓子類去使用。
/*
 *   抽象類,可以沒有抽象方法,可以定義帶有方法體的方法
 *   讓子類繼承後,可以直接使用
 */
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();
	}
}


  1. 抽象關鍵字abstract不可以和哪些關鍵字共存?
    1. private:私有的方法子類是無法繼承到的,也不存在覆蓋,而abstract和private一起使用修飾方法,abstract既要子類去實現這個方法,而private修飾子類根本無法得到父類這個方法。互相矛盾。
    1. final
    1. static