首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 抽象類別完整解析:abstract 關鍵字、抽象方法、繼承規則與五大總結規定

     編輯:Java 程式設計入門

Java 抽象類別完整解析


在面向物件概念中,並非所有類別都能描述具體物件。若類別缺乏足夠資訊描述具體物件,即為抽象類別。除無法實例化物件外,其他功能(成員變數、方法、建構子)與一般類別相同。


抽象類別定義與範例

public abstract class Employee {
    private String name;
    private String address;
    private int number;

    public Employee(String name, String address, int number) {
        System.out.println("Constructing an Employee");
        this.name = name; this.address = address; this.number = number;
    }
    public double computePay() { System.out.println("Inside Employee computePay"); return 0.0; }
    public void mailCheck() { System.out.println("Mailing a check to " + name + " " + address); }
    // ... getter/setter ...
}

雖為抽象類別,仍擁有 3 個成員變數、7 個方法、1 個建構子。


嘗試實例化抽象類別會編譯錯誤

Employee e = new Employee("George W.", "Houston, TX", 43); // 錯誤
// Employee is abstract; cannot be instantiated

繼承抽象類別

透過一般方式繼承,子類別實例化時將繼承父類所有成員。

Salary 繼承 Employee

public class Salary extends Employee {
    private double salary;
    public Salary(String name, String address, int number, double salary) {
        super(name, address, number);
        setSalary(salary);
    }
    public void mailCheck() {
        System.out.println("Within mailCheck of Salary class");
        System.out.println("Mailing check to " + getName() + " with salary " + salary);
    }
    public double computePay() {
        System.out.println("Computing salary pay for " + getName());
        return salary/52;
    }
    // getter/setter ...
}

測試多型參考

public class AbstractDemo {
    public static void main(String[] args) {
        Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
        Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
        System.out.println("Call mailCheck using Salary reference --");
        s.mailCheck();
        System.out.println("\nCall mailCheck using Employee reference--");
        e.mailCheck();
    }
}

執行結果

Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
Mailing check to Mohd Mohtashim with salary 3600.0
Call mailCheck using Employee reference--
Within mailCheck of Salary class
Mailing check to John Adams with salary 2400.0

抽象方法

若想設計類別包含特定方法,但具體實作由子類決定,可在父類宣告為抽象方法:

public abstract class Employee {
    // ...
    public abstract double computePay(); // 無方法主體,以分號結尾
    // ...
}

兩大後果

  1. 包含抽象方法的類別必須是抽象類別
  2. 任何子類別必須重寫抽象方法,或宣告自身為抽象類別

最終必須有具體子類實作該方法,否則從祖先到子孫都無法實例化。


抽象類別五大總結規定

  1. 不可實例化(初學者常犯錯),只有非抽象子類可建立物件
  2. 不一定包含抽象方法,但有抽象方法的類別必定是抽象類別
  3. 抽象方法僅宣告無主體,不提供具體實作
  4. 建構方法、類別方法(static)不可宣告為抽象
  5. 子類別必須實作所有抽象方法,除非子類別也是抽象類別
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved