java-day09-抽象類
9.1 概述
描述狗:吼叫。
描述狼:吼叫。
兩個事物具備共性,向上抽取。犬科具備吼叫功能。
描述一個事物,卻沒有足夠的資訊,這時就將這個事物成為抽象事物。 abstract
面對抽象的事物,雖然不具體,但是可以簡單化,不用面對具體的事物。
abstract class 犬科{ //抽象類 abstract void 吼叫(); } class 狗 extends 犬科{ void 吼叫(){ System.out.println("汪"); } } class 狼 extends 犬科{ void 吼叫(){ System.out.println("嗷"); } }
9.2 抽象類-特點
特點:
- 抽象方法一定定義在抽象類中,都需要用abstract來修飾。抽象類中可以有不是抽象的方法。
- 抽象類不能例項化,不能用new關鍵字建立物件。
- 只有子類覆蓋了所有的抽象方法後,子類具體化,子類就可以建立物件。如果沒有覆蓋所有的抽象方法,那子類還是抽象類。、
抽象類也是不斷向上抽取得來的。抽取了方法的宣告而不確定具體的方法內容。由不同的子類來完成具體的方法內容。
9.3 抽象類-細節
問題:
-
抽象類中有建構函式嗎?
抽象類可以有構造方法,只是不能直接建立抽象類的例項物件而已。在繼承了抽象類的子類中通過super()或super(引數列表)呼叫抽象類中的構造方法。抽象類和一般類的異同點?
相同:都是用來表述事物,都可以進行屬性和行為的描述。
不同:抽象類描述事物的資訊不具體,一般類描述事物的資訊具體。程式碼的不同:
抽象類中可以定義抽象方法,一般類不行。
抽象類不可以例項化,一本類可以例項化。 -
抽象類一定是一個父類嗎?
是的。必須需要子類覆蓋抽象方法後,才可以例項化,使用這些方法。 -
抽象類中可以不定義抽象方法嗎?
可以的。僅僅是讓該類不能建立物件。 -
抽象關鍵字abstract和哪些關鍵字不能共存?
final:被final修飾的方法,不能被覆蓋,但是abstract修飾的方法一定要被子類覆蓋。
private:函式私有化,子類不能訪問
static:靜態方法可以直接類名呼叫,不需要物件呼叫,但是這時候抽象方法沒有意義,因為沒有被實現。
9.4 抽象類-練習
需求:公司中程式設計師有姓名、工號、薪水、工作內容。專案經理除了有姓名、工號、薪水、工作內容,還有獎金。對給出的需求進行資料建模。
分析:問題領域中:
程式設計師
屬性:姓名、工號、薪水
行為:工作內容
專案經理
屬性:姓名、工號、薪水、獎金
行為:工作內容
兩者都不存在所屬關係,但是有共性內容,可以向上抽取。
兩者的共性型別是什麼?僱員。
僱員
屬性:姓名、工號、薪水
行為:工作。
public abstract class Employee {
private String name;
private String id;
private double pay;
Employee(String name,String id,int pay){
this.name = name;
this.id = id;
this.pay = pay;
}
//工作內容
public abstract void work();
}
//描述程式設計師
class Programmer extends Employee{
Programmer(String name,String id,int pay){
super(name,id,pay);
}
public void work(){
System.out.println("code");
}
}
//描述經理
class Manager extends Employee{
private double bouns;
Manager(String name,String id,int pay,double bouns){
super(name,id,pay);
this.bouns = bouns;
}
public void work(){
System.out.println("manager");
}
}