1. 程式人生 > >第3章 抽象類的概述,特點及案例

第3章 抽象類的概述,特點及案例

3.1 抽象類概述
當編寫一個類時,我們往往會為該類定義一些方法,這些方法是用來描述該類的功能具體實現方式,那麼這些方法都有具體的方法體。
但是有的時候,某個父類只是知道子類應該包含怎麼樣的方法,但是無法準確知道子類如何實現這些方法。比如一個圖形類應該有一個求周長的方法,但是不同的圖形求周長的演算法不一樣。那該怎麼辦呢?
分析事物時,發現了共性內容,就出現向上抽取。會有這樣一種特殊情況,就是方法功能宣告相同,但方法功能主體不同。那麼這時也可以抽取,但只抽取方法宣告,不抽取方法主體。那麼此方法就是一個抽象方法。

package demo;
/*
 * abstract:關鍵字,用於修飾方法和類
 * 抽象方法:不同類的方法是相似,但是具體內容又不太一樣,所以我們只能抽取他的宣告,沒有具體的方法體,沒有具體方法體的方法就是抽象方法
 * 抽象類:有抽象方法的類必須是抽象類
 * 
 * 注意:一個類繼承了抽象類需要重寫他所有的抽象方法,否則這個類就得是抽象類
 */
public class AbstractTest {

}

abstract class Animal1 {
	public abstract void eat();

	// 非抽象方法子類可以不重寫
	public void run() {

	}
}

class Cat1 extends Animal1 {

	@Override
	public void eat() {
		System.out.println("貓吃魚");

	}

	/*
	 * public void eat() { System.out.println("貓吃魚"); }
	 */
}

abstract class Dog1 extends Animal1 {
	/*
	 * public void eat() { System.out.println("狗吃屎"); }
	 */
}

3.2 抽象類的特點
抽象類的特點:
抽象方法只能在抽象類裡面
抽象類和抽象方法必須被abstract修飾
抽象類不能建立物件(不能例項化)
抽象類中可以有非抽象的方法
抽象類和類的關係也是繼承
一個類繼承了抽象類要麼重寫所有的抽象方法,要麼他自己是抽象類
3.2.1 案例程式碼十二

package demo;
/*
 * 抽象類的特點:
 * 		抽象方法只能在抽象類裡面
 * 		抽象類和抽象方法必須被abstract修飾
 * 		抽象類不能建立物件(不能例項化)
 * 		抽象類中可以有非抽象的方法
 * 		抽象類和類的關係也是繼承
 * 		一個類繼承了抽象類要麼重寫所有的抽象方法,要麼他自己是抽象類
 */
public class AbstractTest {
	public static void main(String[] args) {
		// Animal a = new Animal();
	}
}

abstract class Animal2 {
	public abstract void eat();

	public void run() {

	}
}

class Cat2 extends Animal2 {

	@Override
	public void eat() {
		// TODO Auto-generated method stub

	}
}

3.3 抽象類的成員的特點
A:抽象類的成員特點:
成員變數
可以有成員變數
可以有常量
成員方法
可以有抽象方法
可以有非抽象方法
構造方法
可以有構造方法的,需要對抽象類的成員變數進行初始化

3.3.1 案例程式碼十三

package demo;

/*
 * 抽象類的成員特點:
 * 		成員變數
 * 			可以有成員變數
 * 			可以有常量
 * 		成員方法
 * 			可以有抽象方法
 * 			可以有非抽象方法
 * 		構造方法
 * 			可以有構造方法的,需要對抽象類的成員變數進行初始化
 * 
 * final:修飾類、成員變數、成員方法
 */
public class AbstractTest {
	public static void main(String[] args) {
		Dog d = new Dog();
		d.barking();
	}
}

abstract class Animal {
	String name = "哮天犬";
	final int num = 10;

	public Animal() {
		System.out.println("我是抽象類的構造方法");
	}

	public abstract void eat();

	public void run() {
	}
}

class Dog extends Animal {
	public void barking() {
		System.out.println(name);
		System.out.println(num);
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub

	}
}

3.5 抽象類的細節
A:抽象類關鍵字abstract可以和哪些關鍵字共存?
1.private:
私有的方法子類是無法繼承到的,也不存在覆蓋,而abstract和private一起使用修飾方法,abstract既要子類去實現這個方法,而private修飾子類根本無法得到父類這個方法。互相矛盾。
2.final:
抽象類不能和final共存,因為抽象類自身無法建立物件,我們需要通過子類建立物件,一旦抽象類使用final關鍵字,那麼抽象類就沒有子類
抽象方法不能和final共存,因為抽象方法後期需要被子類重寫,一旦加final無法重寫
3.static:
抽象方法不能和static關鍵字共存,因為一旦加static我們就可以通過類名直接訪問抽象方法,由於抽象方法沒有方法體,沒有任何意義,也不允許這樣做
B:抽象類中是否可以不定義抽象方法?
是可以的,那這個抽象類的存在到底有什麼意義呢?不讓該類建立物件,方法可以直接讓子類去使用
C:抽象類是否有建構函式?
有,抽象類的建構函式,是由子類的super語句來呼叫,用於給抽象類中的成員初始化