最近在看JAVA核心技術卷1,下面是我自己的理解,如果有不對的地方,歡迎大家指正
抽象類和抽象方法都由abstract關鍵字標記,擁有抽象方法的類就肯定是抽象類,但是抽象類不一定包含抽象方法
抽象方法
先來看下抽象方法的寫法
// 類和方法都由abstract 標記,因爲包含抽象方法的類肯定是抽象類,所以類也要由abstract 標記
public abstract class Person{
// 抽象方法沒有方法體{},不需要具體實現其中的內容
// 抽象方法應該被定義爲public或protected,如果定義爲private則不能被子類繼承,就沒法實現這個方法
// 如果不指定訪問權限,則默認爲public
public abstract void getDescription();
}
抽象類
上面已經說過了,擁有抽象方法的類就肯定是抽象類,但是抽象類也可以不包含抽象方法
我們已經有父類和子類了,一般會繼承父類來創造想要的特定實例,那爲什麼還會提供一個高層次的抽象類呢?這是因爲非抽象方法都是要有具體實現的,而我們有時候只是知道一組子類的共同特性,但還不清楚具體要怎麼實現,而定義成抽象方法就不需要實現了。子類只需要繼承抽象類,再實現其抽象方法即可。
舉個例子
比如學生類(Student),員工類(Employee),人類(Person)
Person類是Student類,Employee類的父類
我們都知道無論是學生還是員工他們都有姓名,年齡,以及個人性格,
姓名和年齡我們明確知道要怎麼實現,所以定義成普通方法即可,但是個人性格我們還不太清楚,所以定義成抽象方法
public abstract class Person{
private String name;
private int age;
public Person(String name ,int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public abstract String getDescription();
}
public class Student extends Person(){
public abstract String getDescription(){
return "a student";
}
}
public class Employee extends Person(){
public abstract String getDescription(){
return "a Employee ";
}
}
抽象類的使用
-
抽象類不能被實例化,如果將一個類聲明爲abstract,就不能創建這個類的對象,new Person()會報錯,但可以創建具體的子類對象;
-
擴展抽象類的兩種選擇
在子類中保留抽象類中的部分或所有抽象方法,扔不具體實現,這樣就必須將子類也設置成抽象類; 在子類中定義全部方法,這樣子類就不是抽象類了。