在java開發中,我們有時會定義了一個父類,這個父類只有對方法的描述,但卻沒有在父類中寫出對方法的實現,這種被定義的方法稱為抽象方法。那么理所當然,含有抽象方法的類就稱為抽象類。用關鍵字abstract修飾。
例如我寫一個父類Person:
1 abstract class Person{ 2 public abstract void study(); 3 public void eat(){ 4 System.out.println("吃的技能"); 5 } 6 }
可以看出,這個Person類被abstract修飾符修飾,而且抽象方法study()中並沒有方法的實現,其中{}可以省略。現在,Person類就是一個標准的抽象類。
其中,抽象類具有具有以下的語法規則需要遵循:
1、一個類中如果有抽象方法,則這個類必須是抽象類。
2、抽象類中可以沒有抽象方法。
3、抽象類是不能存在實例對象的,換句話說就是抽象類就是為了被繼承而存在的。
4、一個子類如果繼承了抽象類,必須實現抽象類中定義的所有抽象方法。
5、抽象類可以繼承抽象類,可以不重寫父類的方法。
接下來,寫兩個繼承Person類的子類:
1 class Student extends Person{ 2 public void study(){ 3 System.out.println("Student的學習內容"); 4 } 5 } 6 7 class Worker extends Person{ 8 public void study(){ 9 System.out.println("Worker的學習內容"); 10 } 11 }
可以看出,兩個子類都分別實現了抽象方法study(),不實現就會報錯。
如果抽象類只有僅僅上面的好處,那感覺和普通的類沒有什么大的區別了,我們完全可以定義兩個普通的類Student和Worker,給它們分別實現study()方法,那么抽象類的意義何在呢?
其實,在調用的時候,我們這么進行調用:
1 Person p = new Worker(); 2 Person s = new Student();
調用的時候采用父類的類型指向子類的實例的語法,這種語法就叫做多態。其好處是一旦需求有改動的時候,修改起來靈活,變化起來容易,不用修改過多的代碼。
最后,在平時寫代碼時要注意,abstract不能與下面修飾符一起用:
1、finaly
2、private
3、static