1. 程式人生 > >java-day09-抽象類

java-day09-抽象類

9.1 概述

描述狗:吼叫。
描述狼:吼叫。
兩個事物具備共性,向上抽取。犬科具備吼叫功能。

描述一個事物,卻沒有足夠的資訊,這時就將這個事物成為抽象事物。 abstract
面對抽象的事物,雖然不具體,但是可以簡單化,不用面對具體的事物。

abstract class 犬科{      //抽象類
	abstract void 吼叫();	
}

class 狗 extends 犬科{
	void 吼叫(){
		System.out.println("汪");
	}
}

class 狼 extends 犬科{
	void 吼叫(){
		System.out.println("嗷");
	}
}

9.2 抽象類-特點

特點:

  1. 抽象方法一定定義在抽象類中,都需要用abstract來修飾。抽象類中可以有不是抽象的方法。
  2. 抽象類不能例項化,不能用new關鍵字建立物件。
  3. 只有子類覆蓋了所有的抽象方法後,子類具體化,子類就可以建立物件。如果沒有覆蓋所有的抽象方法,那子類還是抽象類。、

抽象類也是不斷向上抽取得來的。抽取了方法的宣告而不確定具體的方法內容。由不同的子類來完成具體的方法內容。

9.3 抽象類-細節

問題:

  1. 抽象類中有建構函式嗎?
    抽象類可以有構造方法,只是不能直接建立抽象類的例項物件而已。在繼承了抽象類的子類中通過super()或super(引數列表)呼叫抽象類中的構造方法。

    抽象類和一般類的異同點?
    相同:都是用來表述事物,都可以進行屬性和行為的描述。
    不同:抽象類描述事物的資訊不具體,一般類描述事物的資訊具體。

    程式碼的不同:
    抽象類中可以定義抽象方法,一般類不行。
    抽象類不可以例項化,一本類可以例項化。

  2. 抽象類一定是一個父類嗎?
    是的。必須需要子類覆蓋抽象方法後,才可以例項化,使用這些方法。

  3. 抽象類中可以不定義抽象方法嗎?
    可以的。僅僅是讓該類不能建立物件。

  4. 抽象關鍵字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");
    }
}