跳至內容

Java/抽象

維基教科書,自由的教學讀本

如果一個類沒有包含足夠的信息來描述一個具體的對象就是抽象類。

  1. 類名前加修飾符abstract;
  2. 可包含常規類能包含的任何成員,包括非抽象方法;
  3. 也可包含抽象方法:用abstract修飾,只有方法原型,沒有方法的實現;
  4. 沒有具體實例對象的類,不能使用new方法進行實例化只能用作超類;
  5. 只有當子類實現了抽象超類中的所有抽象方法,子類才不是抽象類,才能產生實例;
  6. 如果是子類有抽象方法未實現,則子類只能是抽象類。
//抽象类
/* File name : Employee.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 " + this.name
+ " " + this.address);
}
public String toString(){
return name + " " + address + " " + number;
}
public String getName(){
return name;
}
public String getAddress(){
return address;
}
public void setAddress(String newAddress){
address = newAddress;
}
public int getNumber(){
return number;
}
}

Employee 類現在是抽象的,但它仍然有三個變量,七個方法,一個構造方法。


抽象方法

如果你想一個提供特定方法的類,但是你想要在他的子類中實際實現這個方法,你可以在父類中聲明這個方法為抽象的。

abstract 關鍵字也被用來定義抽象方法。 抽象方法只包含一個方法名而沒有方法體。 方法名之後直接跟一個分號,而不是花括號。

public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
//Remainder of class definition
}

聲明一個抽象方法有兩個結果:

  1. 如果一個類中含有一個抽象方法,類必須也是抽象的。
  2. 任何一個子類必須覆蓋這個抽象方法,或者繼續將它聲明為抽象方法。

子類繼承一個抽象方法,必須要去覆蓋他。如果不這樣做的話,它們必須將其繼續聲明為抽象,或在它們的子類中去覆蓋它們。最終,後代類不得不去實現抽象方法;否則你會一直有一個不能被實例化的抽象類。

如果 Salary 繼承 Employee 類,則他必須如下要去實現 computerPay() 方法:

/* File name : Salary.java */
public class Salary extends Employee
{
private double salary; // Annual salary
public double computePay()
{
System.out.println("Computing salary pay for " + getName());
return salary/52;
}
//Remainder of class definition
}