第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語句來呼叫,用於給抽象類中的成員初始化