Java抽象類

Java抽象類概念

在面向對象的概念中,所有的對象都是通過類來描繪的,但是反過來,並不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。

抽象類除了不能實例化對象之外,類的其它功能依然存在,成員變量、成員方法和構造方法的訪問方式和普通類一樣。

由於抽象類不能實例化對象,所以抽象類必須被繼承,才能被使用。也是因爲這個原因,通常在設計階段決定要不要設計抽象類。

父類包含了子類集合的常見的方法,但是由於父類本身是抽象的,所以不能使用這些方法。

在Java中抽象類表示的是一種繼承關係,一個類只能繼承一個抽象類,而一個類卻可以實現多個接口。

 抽象類

在Java語言中使用abstract class來定義抽象類。如下實例:

People.java文件

package com;

/**
 * @author HeLiu
 * @Description 人抽象類(Java語言中使用abstract class來定義抽象類)
 * @date 2018/11/9 10:31
 */
public abstract class People {

    private String name;

    private Integer age;

    private String sex;

    public People(String name, Integer age, String sex) {
        System.out.println("Constructing an People");
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public void smile() {
        System.out.println("ha...ha...ha...");
    }

    public void said() {
        System.out.println("My name is " + name + ",I am " + age + " years old.");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String toString() {
        return "people:[" + name + "," + age + "," + sex + "]";
    }
}

 

注意到該People類沒有什麼不同,儘管該類是抽象類,但是它仍然有3個成員變量,9個成員方法和1個構造方法。 現在如果你嘗試如下的例子:

AbstractDemo.java文件
package com;

/**
 * @author HeLiu
 * @Description 抽象類測試
 * @date 2018/11/9 10:55
 */
public class AbstractDemo {

    public static void main(String[] args) {
        //這裏會直接報錯,是不被允許的 java: com.People是抽象的; 無法實例化
        People people = new People("Lary", 18, "女");

        System.out.println("Introduce yourself with a smile.");

        people.smile();
        people.said();
    }
}

 

當你嘗試運行main方法的時候回報這樣的錯誤: 

People是抽象的; 無法實例化

 繼承抽象類

通過繼承People

Lary.java文件

package com;

/**
 * @author HeLiu
 * @Description 繼承People
 * @date 2018/11/9 11:47
 */
public class Lary extends People {

    public Lary(String name, Integer age, String sex) {
        super(name, age, sex);
    }

}

 

儘管我們不能實例化一個People類的對象,但是如果我們實例化一個Lary類對象,該對象將從People類繼承成員方法,且通過該方法可以設置或獲取成員變量。

 AbstractDemo.java文件

package com;

/**
 * @author HeLiu
 * @Description 抽象類測試
 * @date 2018/11/9 10:55
 */
public class AbstractDemo {

    public static void main(String[] args) {

        Lary lary = new Lary("Lary", 18, "女");
        System.out.println("Introduce yourself with a smile.");
        lary.smile();
        lary.said();

        System.out.println("-------------------------------------------");

        People people = new Lary("Join", 16, "男");
        System.out.println("Introduce yourself with a smile.");
        people.smile();
        people.said();

    }
}

運行結果:

抽象方法

如果你想設計這樣一個類,該類包含一個特別的成員方法,該方法的具體實現由它的子類確定,那麼你可以在父類中聲明該方法爲抽象方法。

Abstract關鍵字同樣可以用來聲明抽象方法,抽象方法只包含一個方法名,而沒有方法體。

抽象方法沒有定義,方法名後面直接跟一個分號,而不是花括號。

 

public abstract class People {

    private String name;

    private Integer age;

    private String sex;

    //抽象方法
    public abstract String ownName();

    //其餘代碼

}

 

聲明抽象方法會造成以下兩個結果:

  • 如果一個類包含抽象方法,那麼該類必須是抽象類。
  • 任何子類必須重寫父類的抽象方法,或者聲明自身爲抽象類。

繼承抽象方法的子類必須重寫該方法。否則,該子類也必須聲明爲抽象類。最終,必須有子類實現該抽象方法,否則,從最初的父類到最終的子類都不能用來實例化對象。

 如果Lary類繼承了People類,那麼它必須實現ownName()方法:

public class Lary extends People {

    public Lary(String name, Integer age, String sex) {
        super(name, age, sex);
    }

    @Override  這行可以去掉
    public String ownName() {
        //這裏面的業務邏輯代碼可以按照你的實際需求編寫
    }

    //其餘代碼

}

抽象類總結規定

  • 1. 抽象類不能被實例化(初學者很容易犯的錯),如果被實例化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以創建對象。

  • 2. 抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

  • 3. 抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現也就是方法的具體功能。

  • 4. 構造方法,類方法(用static修飾的方法)不能聲明爲抽象方法。

  • 5. 抽象類的子類必須給出抽象類中的抽象方法的具體實現,除非該子類也是抽象類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章